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)
和
没有进一步的条件。
否则,您可能宁愿寻找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)