动画应仅在按下按钮时播放

时间:2019-09-16 09:42:45

标签: c# unity3d

在Unity中播放动画时出现问题。我进行了交易,并在动画上设置了布尔值。这里的问题是,如果我在循环上放动画,它不会停止。如果我取消循环播放,它只会播放一次。我真正想要的是仅在玩家按下按钮时才播放。现在我的代码看起来像这样。我试图在不同的地方将布尔值设置为false,但是效果不理想。我将不胜感激。谢谢

private void Inflations()
    {
        inflationTimer -= Time.deltaTime;
        //if hands are in mount area inflate
        if (OVRInput.GetDown(OVRInput.Button.Any))
        {
            if (inflationTimer <= 0 && rightHand.inflated)
            {
                if (inflated)
                {
                    inflationTimer = inflationSpawn;
                    inflated = false;
                    inflationAnimator.SetBool("Pressed", true);

                    //we can add inflations only if they are under 2 and if the button is pressed and released
                    inflations++;
                }
                else
                {
                    inflationAnimator.SetBool("Pressed", false);
                }
                tempo.SetInflations(inflations);
            }
        }


        if (OVRInput.GetUp(OVRInput.Button.Any))
        {
            if (!inflated)
            {
                inflated = true;
            }
        }
        if (inflations >= 2)
        {
            inflationAnimator.SetBool("Pressed", false);
            state = stueState.TakeInflator;
            inflationsDone = true;
        }
    }

1 个答案:

答案 0 :(得分:1)

@ecco是正确的,您需要两个状态

在没有看到Animator Controller的情况下,您可以使用类似这样的内容;

//...
Stack<Action> _animations = new Stack<Action>();

private void Inflations()
{
   // ...
   if (OVRInput.GetDown(OVRInput.Button.Any))
   {
       if(inflated){
          // your code
          _animations.Push(() => inflationAnimator.SetBool("Pressed", true));
          // ...
       }
   }
}

private void Update(){
   if(_animations.Count > 0){
      var currentAnimation = _animations.Pop();
      currentAnimation();
   }
}

这消除了对大量if检查的需求,并且很好用。

注意:为简单起见,我在这里使用了 lambda表达式 。您可以在here中了解更多信息。您还可以阅读有关 Stack 容器here

的更多信息

更新功能将检查堆栈中是否有动画,如果有,它将自动执行一次并将其从堆栈中删除。