Unity Animator SetTrigger 未重置为默认值

roo*_*era 3 c# unity-game-engine

正如我希望正确理解动画器“SetTrigger”一旦完成就会将动画设置为 false(如果我错了,请纠正我),但我的项目并非如此。

我有两种状态。默认(不执行任何操作)和移动。打开应用程序时会自动输入默认值,并且当我调用“SetTrigger”时会触发移动。我希望动画完成后 Animator 会将此动画 id 设置为 false,然后返回到默认状态。但事实并非如此——动画不断重复。我可以通过手动调用“ResetTrigger”来实现此目的,但随后我需要检测动画何时完成,这对我来说并不方便。

我想实现动画在调用时只播放一次。有任何想法吗?

谢谢

编辑:添加动画控制器

在此输入图像描述

public class TestAnimation : MonoBehaviour
{

    private Animator _animation;
    private static readonly int Playing = Animator.StringToHash("PlayingTrigger");

    // Start is called before the first frame update
    void Start()
    {

        _animation = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {

        if (Input.GetKeyDown(KeyCode.A))
        {
            _animation.SetTrigger(Playing);
         //   _animation.ResetTrigger(Playing);

            IDebug.Log("Playing animation ");
        }
        
        if (Input.GetKeyDown(KeyCode.R))
        {
            _animation.ResetTrigger(Playing);
            IDebug.Log("reseting animation ");
        }
        

    }
}
Run Code Online (Sandbox Code Playgroud)

der*_*ugo 11

动画器“SetTrigger”一旦完成就会将动画设置为 false

->不!

它所做的唯一事情是在用于转换时重置触发器本身,这并不意味着动画到达结束后动画状态就会重置。

如果您希望 Animator 在动画完成后返回到空闲/默认状态,则在控制器中添加一个过渡

yourState -> Idle/Default
Run Code Online (Sandbox Code Playgroud)

  • 有退出时间 -> True
  • 持续时间 -> 随意
  • 退出时间 -> 1 - 持续时间

没有进一步的条件。

否则,您可能宁愿寻找Bool参数,Animator.SetBool而是


另请注意另一个陷阱:触发器可以叠加!

这意味着如果您调用 5 次SetTrigger,那么该触发器将用于 5 次转换,直到它最终重置并且不再触发转换!

因此,我最终使用了一个触发器重置器,它不直接附加到特定状态,而是附加到基本层本身-> 对于每个输入的状态都会自动调用它:

public class TriggerResetter : StateMachineBehaviour
{
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        foreach(var p in animator.parameters)
        {
            if (p.type == AnimatorControllerParameterType.Trigger)
            {
                animator.ResetTrigger(p.name);   
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)