読者です 読者をやめる 読者になる 読者になる

UnityのAnimatorでアニメーション遷移するときの自分なりの解

設計の指標なので、なんとなくUnityできる人向けな感じする

 

AnimatorController

アニメーションアセットを登録してトランジション作ったり、パラメータを色々持てる

 

Animatorの管理

アニメーションのトランジション制御をパラメータで行うのはトランジション設定を毎回やらないといけないし、矢印が量産されすぎてつらい

矢印量産をめんどくさがって減らすと、一回DefaultStateを経由させてアニメーション遷移させる羽目になったり

スクリプトでアニメーションの制御を行うとスクリプト上で保存してるキャラクターの現在のStateとアニメーションのパラメータがズレる自体が頻出して拡張性が皆無・・・

 

スクリプトを使わない(使えない)なら

トランジション制御をぽちぽち頑張って作るしかないけど

 

スクリプトを使えるなら

AnimatorにStateを登録し、ScriptableObjectに対応したStateNameやHashをテーブルとして登録

Animator.CrossFadeInFixedTime(Statename,duration);で制御すると良い

動的にトランジション制御を作成してくれるので、とても楽

ただ、レイヤー内を総当たりで検索してるらしいので、アニメーションの数が膨大になるとパフォーマンス的に厳しくなるのかも

ちなみにCrossFade(StateHash,duration);だとdurationが実時間分の遷移ではないので、意図した動作にならない

CrossfadeInFixedTimeおすすめ

 

制御の詰まりポイント

CrossFadeInFixedTimeのdurationが0よりも大きい時(主に3Dで、モーションブレンドさせたい時)

CrossFadeInFixedTimeを呼ぶと、前のStateからCrossFade先のStateに移動するまでにduration分の時間がかかる

遷移中、currentStateは遷移が完全に終わらない限り前のStateのままなので

if(StateName == NextStateName) return;

みたいな形で

同じステートの時アニメーションが最初から再生される動作を弾くチェックしようとしても弾けない

他にも、遷移中にさらに遷移が行われてしまう要因にもなる

 

解決方法として、アニメーションの遷移を行った時は、コルーチンを使って

yield return new WaitForSeconds(duration);でアニメーション制御を待機させてあげるとうまく遷移できる

 

結果

Animatorぽちぽち地獄から解放されて、テーブル弄るだけでアニメーション制御の書き換えもできるようになる

今の所問題はないけどあったら追記予定

 

2016/8/25 追記

qiita.com

 

こんなものがあった。

併用してアニメーション遷移の汎用コンポーネント作りたい