UnityアニメーターコントローラのBehaviourでアニメを制御する

今回は通常のスクリプトからアニメーションの状態を確認して、アニメーションを制御するのではなく、UnityのアニメーターコントローラにStateMachineBehaviour(スクリプト)を追加し、アニメーターコントローラー側のスクリプトでアニメーション制御をします。

前回までは移動スクリプト(Move)でキャラクターが今どの状態かを制御していろいろな処理をしていました。

歩いているアニメーションが終了した時に何らかの処理をしたい!
と思った時に今どのアニメーションが再生されているか?という情報をスクリプトから取得する必要がありました。

これでうまく制御出来れば問題ないですが、スクリプトを書くのが結構大変です。

そこでアニメーションコントローラーのStateMachineBehaviourを使って、アニメーションの遷移がどういう状態かをアニメーションコントローラ側で管理し、そこでしたい処理を加えるという風にしてみます。

では作ってみましょう。

スポンサーリンク

Behaviourを作成して設定する

アバター6

Walkの状態を選択し、インスペクタを表示します。

Add Behaviourをクリックし、スクリプトを作成します。今回はEndWalkにしました。
BehaviourはC#のみになるみたいです。
スクリプトはデフォルトでいくつか記述されておりコメント化してあります。

今回は歩くアニメーションが終了した時にDebug.Logを使って「アニメーションが終了」という表示をしてみます。

EndWalkのコメントにしてあるoverride public void OnStateExitをコメントを外して使います。

OnStateExitはアニメーションの再生が終わると呼び出されるので歩くアニメーションの終了と同時に「アニメーションが終了」という文字がコンソールに表示されます。

Behaviourの問題点!?

アニメーションの再生が始まった時や終わった時などに何らかの処理をしたいという時はかなり便利です。

ゲームオブジェクトはpublicで指定すれば取得出来ます。

ただシーン上のコンポーネントを取得するのは通常通りには出来ません。
(JavaScriptからC#でかかれたBehaviourを使う場合)

LineRenderer line = (LineRenderer) FindObjectOfType(typeof(LineRenderer));

上のようにObjectクラスのFindObjectOfTypeで指定したコンポーネントのタイプを取得する事が出来ます。

処理はかなり遅いようなので?一時的に利用する個所だけで使った方がよさそうです。
スクリプトの取得は出来なさそう?です。

というよりはBehaviourはC#でしか作成する事が出来ず、C#スクリプトの取得であれば出来そうです。

JavaScriptからC#の読み出し、C#からJavaScriptの読み出しをしたい場合は別途やり方があるみたいですね。

BehaviourもJavaScriptで作成が出来たらいいんですが・・・。

FindObjectsOfTypeで複数取得する事が出来ます。

アニメーターに関する制御だけならば、引数として受け取っているので、歩くアニメーションが終了したら、アニメーターパラメータの値を変更する。というような時は簡単に出来ます。

これでAnimatorControllerのStateMachineBehaviourでアニメーションを制御する事が出来るようになりました。

今回は実のある使い方はしてませんが・・・・、

Unityのアクションゲームで連続攻撃を実現する方法
Unityのアクションゲームで連続攻撃が出来る機能を作成します。現在攻撃中の時に攻撃ボタンを押したら次の攻撃アニメーションが再生されるようにします

↑の記事でBehaviourを実践的に使ってみました。

次回からバイオハザード風のガンシューティングの機能を作っていきたいと思います。
パソコン用のコントローラーを持っていないので、キーボードで操作出来るように無理やりやってみます。(`´)

おそらくやる事がたくさんあるので1回の記事では終了しないかと思われます。(^。^)