unity3d Unity Animator设置触发器未重置为默认值

tuwxkamq  于 2023-02-19  发布在  其他
关注(0)|答案(2)|浏览(370)

正如我希望正确理解的动画“设置触发器”将设置动画假一旦它完成(纠正我,如果我错了),但这不是我的项目的情况。
我有两个状态。默认(什么都不做)和Move。当应用程序打开时会自动进入默认状态,当我调用“SetTrigger”时会触发Move。我期望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 ");
        }
        

    }
}
wh6knrhe

wh6knrhe1#

动画师“SetTrigger”将在动画完成后将其设置为假

  • 不!
    它所做的唯一一件事是重置触发器本身,一旦它被用于变换,这并不意味着动画状态被重置,一旦动画已经到达终点。
    如果你想让你的动画师回到空闲/默认状态后,你的动画完成,然后在控制器中添加一个transition
yourState -> Idle/Default

  • 具有退出时间-〉True
  • 持续时间-〉如您所愿
  • 退出时间-〉1 -持续时间

无其他情况。
否则,您可能更愿意查找Bool参数和Animator.SetBool
但有一个陷阱:Afaik的触发器可以堆叠!
这意味着,如果调用5次SetTrigger,则该触发器将用于5次转换,直到它最终重置,不再触发转换!
至少在早期的版本中是这样的。。不确定这是否曾经改变过。
因此,我最终使用了一个触发器重置器,它不是直接连接到特定的状态,而是连接到Basic层本身-〉它会为每个进入的状态自动调用:

public class TriggerRestter : 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);   
            }
        }
    }
}
bihw5rsg

bihw5rsg2#

正如@derHugo所指出的;触发器本身得到重置,但不是实际的动画。它困扰了我一段时间。修复相当简单,所有你需要做的是使过渡回到以前的状态(从触发器被触发)。

相关问题