settrigger、意外とめんどくさかかったのでメモ。
たしかにググっても「知らないとハマる」とか色々書かれてたし、実際ハマった。
内部でtrueとfalseを持っていて、実行するとtrueになったあと自動でfalseになる。
このためsettriggerが完了するまで待ってあげないといけない。
完了するまえにanimatorを無効にすると
次にanimatorを有効にしたときに前回のtriggerが残っていて暴発する。
settrigger設定してるのになんか挙動がおかしいと思ったらUnityの実行順を確認する。
https://docs.unity3d.com/Manual/ExecutionOrder.html
settriggerに関わるのはOnAnimatorMoveの部分
https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnAnimatorMove.html
完了時にトリガーをリセットするなどの処理をいれてみるといいかもしれない。
void OnAnimatorMove() { var animator = GetComponent<Animator>(); animator.ResetTrigger("trrigerName"); }
1フレーム待つとき
参考:https://hacchi-man.hatenablog.com/entry/2020/02/18/013000
private IEnumerator WaitAnimationImpl(){ var animator = gameObject.GetComponent<Animator>(); yield return null; var state = animator.GetCurrentAnimatorStateInfo(0); yield return new WaitWhile(() => state.IsName("animationステート名")); }
もしくはコルーチンで強制的に飛ばしちゃうとか
参考:http://halcyonsystemblog.jp/blog-entry-659.html
private IEnumerator SkipAnimation(){ var animator = GetComponent<Animator>(); animator.SetTrigger("trrigerName"); // Animatorのステート変更に1フレームかかるので待つ yield return new WaitForEndOfFrame(); // アニメーションの最後にする animator.Play(animator.GetCurrentAnimatorStateInfo(0).fullPathHash, 0, 1); }
参考になれば。
※コメントは承認後に表示されます。
コメントを公開されたくない場合、名前の後に「:非公開」とつけてください。