【问题标题】:Unity Animator SetTrigger not resetting to defaultUnity Animator SetTrigger 未重置为默认值
【发布时间】:2021-05-19 14:26:16
【问题描述】:

正如我希望正确理解的那样,Animator“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 ");
        }
        

    }
}

【问题讨论】:

  • 没有动画界面的图像有点难以解释,但是您可以创建布尔变量并将其关联到动画之间的过渡条件(箭头)中。在某种程度上,当您在脚本中激活而不是布尔值时,动画开始,当您将其设置为 false 时,动画停止。我希望这对你有帮助:)

标签: c# unity3d


【解决方案1】:

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

-> 不行!

它所做的唯一一件事就是重置触发器本身,一旦它被用于过渡,这并不意味着一旦动画结束,动画状态就会被重置。

如果您希望 Animator 在动画完成后返回空闲/默认状态,请在控制器中添加 transition

yourState -> Idle/Default

  • 有退出时间 -> 真
  • 持续时间 -> 随你喜欢
  • 退出时间 -> 1 - 持续时间

没有其他条件。


不过有个陷阱:Afaik 触发器可以叠加!

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

至少在早期版本中是这样......不确定这是否曾经改变过。

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

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);   
            }
        }
    }
}

【讨论】:

  • 谢谢。但是,它仍然没有转换到默认状态(蓝色转换箭头),使用我定义的参数,就像你说的那样。 (请检查原始帖子的编辑)
  • 你确定不是马上又转回来了吗?
  • 为了测试,我只需按下键盘按钮。如果在该完整状态下我再次按下激活按钮,它将转换为默认值。所以我很肯定...... eye_move 中的蓝线没有移动......
  • 刚刚做了。请检查一下。
  • 这听起来你仍然有一个条件,使用相同的触发器返回到 eye_move 状态的转换......你能显示两者的转换设置吗?
【解决方案2】:

正如@derHugo 指出的那样;触发器本身被重置,但不是实际的动画。它困扰了我一段时间。修复非常简单,您需要做的就是转换回之前的状态(触发触发器的状态)。

【讨论】:

    猜你喜欢
    • 2022-12-11
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2011-04-06
    • 2012-10-31
    相关资源
    最近更新 更多