今回は通常のスクリプトからアニメーションの状態を確認して、アニメーションを制御するのではなく、UnityのアニメーターコントローラーにStateMachineBehaviour(スクリプト)を追加し、アニメーターコントローラー側のスクリプトでアニメーション制御をします。
前回まではキャラクター移動スクリプトでキャラクターが今どの状態かを制御していろいろな処理をしていました。
歩いているアニメーションが終了した時に何らかの処理をしたい!と思った時に今どのアニメーションが再生されているか?という情報をスクリプトから取得する必要がありました。
これでうまく制御出来れば問題ないですが、スクリプトを書くのが結構大変です。
そこでアニメーションコントローラーのStateMachineBehaviourを使って、アニメーションの状態と遷移がどうなっているかをアニメーションコントローラー側で管理し、そこでしたい処理を加えるという風にしてみます。
では作ってみましょう。
Behaviourを作成して設定する
まずはBehaviourを作成して設定してみます。
Animator ControllerのWalk等の状態を選択し、インスペクタを表示します。
Add Behaviourをクリックし、スクリプトを作成します。今回はEndWalkにしました。
スクリプトはデフォルトでいくつか記述されておりコメント化してあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class EndWalk : StateMachineBehaviour { // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state //override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) //{ // //} // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks //override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) //{ // //} // OnStateExit is called when a transition ends and the state machine finishes evaluating this state //override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) //{ // //} // OnStateMove is called right after Animator.OnAnimatorMove() //override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) //{ // // Implement code that processes and affects root motion //} // OnStateIK is called right after Animator.OnAnimatorIK() //override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) //{ // // Implement code that sets up animation IK (inverse kinematics) //} } |
今回は歩くアニメーションが終了した時にDebug.Logを使って「アニメーションが終了」という表示をしてみます。
EndWalkのコメントにしてあるoverride public void OnStateExitをコメントを外して使います。
1 2 3 4 5 | override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { Debug.Log ("アニメーションが終了"); } |
OnStateExitはアニメーションの再生が終わると呼び出されるので歩くアニメーションの終了と同時に「アニメーションが終了」という文字がコンソールに表示されます。
StateMachineBehaviourを使う利点
アニメーションの再生が始まった時や終わった時などに何らかの処理をしたいという時はかなり便利です。
フィールドはpublicや[SerializeField]アトリビュートを指定すれば取得出来ます。
アニメーターに関する制御は引数としてAnimatorを受け取っているので、歩くアニメーションが終了したら、『アニメーションパラメータの値を変更する』というような時は簡単に出来ます。
アニメーターコントローラーでアニメーション途中で別のアニメーションへと遷移させると通常のスクリプトで『アニメーションが終了したら』という条件を書くのが結構面倒になったりうまく判定できなくなります。
そんな時にStateMachineBehaviourを使うとアニメーターコントローラーの状態に取り付けその状態での判断が可能なので条件漏れを防ぐことが出来ます。
終わりに
これでAnimatorControllerのStateMachineBehaviourでアニメーションを制御する事が出来るようになりました。
今回は実のある使い方はしてませんが・・・・、
↑の記事でBehaviourを実践的に使ってみました。
次回からバイオハザード風のガンシューティングの機能を作っていきたいと思います。
パソコン用のコントローラーを持っていないので、キーボードで操作出来るように無理やりやってみます。(`´)
おそらくやる事がたくさんあるので1回の記事では終了しないかと思われます。(^。^)