正如我希望正确理解动画器“SetTrigger”一旦完成就会将动画设置为 false(如果我错了请纠正我),但我的项目并非如此。
我有两种状态。默认(不执行任何操作)和移动。打开应用程序时会自动输入默认值,并且当我调用“SetTrigger”时会触发移动。我希望动画完成后 Animator 会将此动画 id 设置为 false,然后返回到默认状态。但事实并非如此——动画不断重复。我可以通过手动调用“ResetTrigger”来实现此目的,但随后我需要检测动画何时完成,这对我来说并不方便。
我想实现动画在调用时只播放一次。有任何想法吗?
Thanks
编辑:添加动画控制器
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 ");
}
}
}
动画器“SetTrigger”一旦完成就会将动画设置为 false
-> Nope!
它唯一做的就是重置trigger一旦它用于过渡,它本身并不意味着动画状态在动画到达结束后重置。
如果您希望动画完成后返回到空闲/默认状态,请在控制器中添加过渡 https://docs.unity3d.com/Manual/class-Transition.html
yourState -> Idle/Default
with
- 有退出时间 -> True
- 持续时间 -> 随意
- 退出时间 -> 1 - 持续时间
没有进一步的条件。
否则你可能宁愿寻找一个Bool参数和Animator.SetBool
instead
但有一个陷阱:触发器可以叠加!
这意味着如果您拨打 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);
}
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)