はじめに
今回はAnimator.CrossFadeInFixedTimeを使ったアニメーションの遷移を実装する記事になります!
みなさん下のような3つの状態がある場合、Idle
からSampleAnimation1
、SampleAnimation2
に遷移をさせたいときどのように実装をするでしょうか。
きっと多くの人がAnimatorController
を使ってtransition
(矢印)で繋げて、Bool
やTrigger
を条件に付ける方法を思いつくと思います。
しかしそうすると矢印がそこらじゅうにあり、かつフラグがいっぱいという事態になることがよくあります。
その解決策として、Animator.CrossFadeInFixedTime
を使うことでtransition
を繋ぐことなく状態遷移することができます。
というわけで実際にみていきましょう!
Animator.CrossFadeInFixedTimeとは
Unityの公式リファレンスではこのように説明されています。
秒単位の時間を使用して、現在の状態から他の状態へのクロスフェードを作成します。
Animator-CrossFadeInFixedTime - Unity スクリプトリファレンス
つまり指定した時間をかけて他のアニメーションに遷移することができるということです。
オプション引数は基本いじらないと思うので、必要最低限のメソッドは以下の通りです。
public void CrossFadeInFixedTime (string stateName、float fixedTransitionDuration)
引数名 | 意味 |
---|---|
stateName | ステートの名前 |
fixedTransitionDuration | 状態を遷移するのにかかる時間(秒) |
下準備
今回実装するにあたって以下のアニメーションを用意しました。
Idle
SampleAnimation1
SampleAnimation2
これをIdle -> SampleAnimatioin1 -> SampleAnimation2
という遷移を行いたいと思います。
※Animation
のループはfalse
にしとおいてください
実装
さきほどのAnimator.CrossFadeInFixedTime
を用いて実装してみます。
using System.Collections; using UnityEngine; public class TransitionTest : MonoBehaviour { [SerializeField] private Animator _animator; private IEnumerator Start() { //0.5秒待つ yield return new WaitForSeconds(0.5f); //Idle -> SampleAnimation1 に遷移 _animator.CrossFadeInFixedTime("SampleAnimation1", 0); //1秒待つ yield return new WaitForSeconds(1); //SampleAnimation1 -> SampleAnimation2 に遷移 _animator.CrossFadeInFixedTime("SampleAnimation2", 0); } }
このスクリプトをゲームオブジェクトにアタッチして、Animator
の参照を付けた後に実行してみると・・・。
より使いやすくする
ここはある程度Unityの知識が必要かもしれませんが、アニメーション遷移とStateパターンはかなり親和性が高いと思います。
ここに書くと記事が長くなってしまうので書きませんが、以下の記事のように実装してみるとかなり使い勝手がよくなるはずです。
さいごに
私はちまちま矢印を繋いだりフラグ管理したりするのが嫌いなので、この方法の方がかなり好きです。
もし同じように感じる方がいれば、一度試してみてはどうでしょうか!