Unityに関連する記事です

 発展1、および発展2において、エネミー用のゲームオブジェクトにスクリプタブル・オブジェクトのデータを利用して、エネミーとしての振る舞いを変える処理を実装しました。
この手順では未実装であったエネミーの移動用アニメーションについてもスクリプタブル・オブジェクトに登録し、エネミーごとのアニメーションの設定を自動的に行う機能を実装します。


<実装動画>
動画ファイルへのリンク


 以下の内容で順番に実装を進めていきます。

発展5 −エネミーのアニメーションの自動設定機能の実装−
 9.各エネミーごとの移動用のアニメーションを作成する
10.EnemyDataSO スクリプトと EnemyController スクリプトを修正し、エネミー用のプレファブに EnemyDataSO スクリプタブル・オブジェクトのデータを参照してエネミー毎のアニメーションを設定する処理を追加する


 新しい学習内容は、以下の通りです。

 ・AnimatorOverrideController クラス



9.各エネミーごとの移動用のアニメーションを作成する

1.設計


 エネミーの移動のアニメーションには Blend Tree の機能を利用して、移動している方向に合わせて4種類の向きのアニメーションを同期させています。
この Blend Tree によるアニメーションの遷移させる情報をそのまま利用しつつ、4方向のアニメーションだけを各エネミーの AnimationClip に変更する機能を実装します。

 これは Unity が用意している AnimatorOverrideController を利用することで実装出来ます。

 そのための準備を順番に行っていきます。


2.エネミーごとに移動用のアニメーションを AnimationClip で作成する


 以前に学習したエネミーの移動用スプライトアニメーションを製作する手順を参考にして、
各エネミーごとに4方向分の移動のアニメーションを AnimationClip として作成します。

 エネミーごとにフォルダを作成して管理をするとわかりやすいです。
また、EnemyData のエネミーの通し番号とファイルの名前もリンクしておくとわかりやすくなります。


フォルダ画像



 なお、アニメーションを作成するたびに、新しいゲームオブジェクトと AnimatorController も作成されますが、そちらは利用しません
AnimationClip を4方向分だけ作ったら、一緒に作成されるゲームオブジェクトと AnimatorController については削除してください。


参考画像(各エネミーのフォルダを同じように作ります)



3.エネミーごとに AnimatorOverrideController を作成して、ベースとなる AnimatorController と、各エネミーごとの移動のアニメーション(AnimationClip)を登録する


 まずは最初に、現在利用しているエネミーの AnimatorController ですが、名称を Base_Enemy に変更し、EnemyBase フォルダへ移動してください。
この AnimatorController を元にして、これから作成する AnimatorOverrideController を設定していきます。


Base_Enemy



 次に、各エネミーの移動用のアニメーションを登録するための AnimatorOverrideController を作成します。
これは、各エネミーにつき、1つずつ作成します。

 まずは Enemy_0 のフォルダ内で右クリックをしてメニューを開き、Create => AnimatorOverrideController を選択してください。
AnimatorController に似たアイコンの AnimatorOverrideController が作成されます。(こちらのアイコンは右下にプラスマークがあります)
名前は Enemy_0 のように、エネミーの通し番号に準じたファイル名にしておくと、今後、管理しやすくなります。

 AnimatorOverrideController の機能としては、Blend Tree などで作成しているアニメーションの遷移の情報をそのまま利用し、
適用するアニメーションの内容だけを上書きして差し替える機能を有しています。

 そのため、現在エネミーが利用している Move ステート内の Blend Tree の機能はそのままで、Blend Tree 内で設定している各アニメーションの内容のみを上書きすることが出来ます。


<Move ステートの Motion に設定されている Blend Tree のアニメーションの遷移条件をそのまま使う>



<各Motion をそれぞれ別の内容で登録できる>



参考サイト
Unity 公式スクリプト・リファレンス
AnimatorOverrideController
https://docs.unity3d.com/ja/2018.4/ScriptReference...



 それでは早速登録していきます。

 Enemy_0 の AnimatorOverrideController を選択してインスペクターを確認します。

 Controller の項目には、ベースとなるエネミーの AnimatorController を設定します。
こちらには先ほど名称を変更した EnemyBase フォルダ内にある Base_Enemy をドラッグアンドドロップしてアサインします。
これでベースとなる AnimatorController が設定されました。自動的に、Blend Tree の中で設定している4つの Motion を登録するための情報が表示されます。

 こちらに、4方向分の AnimationClip をドラッグアンドドロップしてアサインしてください。
それでエネミー1体分の AnimatorOverrideController が完成です。
 

 この手順を、エネミーの数だけ繰り返して、すべてのエネミーに AnimatorOverrideController を用意してください


インスペクター画像



フォルダ画像



インスペクター画像



フォルダ画像



10.EnemyDataSO スクリプトと EnemyController スクリプトを修正し、エネミー用のプレファブに EnemyDataSO スクリプタブル・オブジェクトのデータを参照してエネミー毎のアニメーションを設定する処理を追加する

1.設計


 EnemyDataSO スクリプト内にある EnemyData クラスを修正し、先ほど作成したアニメーションを登録するための変数を新しく追加します。
その後、EnemyController スクリプトの修正し、EnemyData にアニメーションがある場合、エネミーごとのアニメーションに上書きする処理を実装します。


2.EnemyDataSO スクリプト内の EnemyData クラスを修正して、AnimatorOverrideController の情報を登録するための変数を追加する



EnemyDataSO.cs

 <= クリックすると開きます


 スクリプトを修正したらセーブします。


3.EnemyDataSO スクリプタブル・オブジェクトに各エネミーごとに作成した AnimatorOverrideController を登録する



 Datas フォルダ内にある EnemyDataSO スクリプトを確認します。
新しく EnemyData クラスに追加した enemyOverrideController 変数が表示されていますので、
こちらに各エネミー用に作成した AnimatorOverrideController をそれぞれアサインして登録してください。


インスペクター画像


 最後に EnemyController スクリプトを修正し、この enemyOverrideController 変数の情報を利用して、エネミーの移動アニメーションの差し替え(上書き)する処理を追加します。


4.EnemyController スクリプトを修正し、エネミーのアニメーションを EnemyData 内にあるアニメーションの情報に上書きする処理を追加する


 アニメーションを上書きするには、Animator コンポーネントに対して処理を実行します。
そのため、現在 SetUpEnemyController メソッド内で TryGetComponent メソッドを利用して Animator コンポーネントを取得する部分を修正し、
Animator コンポーネントの取得が出来た場合には、アニメーションを上書きするメソッドを実行するように分岐を作成します

 アニメーションの上書きを行う SetUpAnimation メソッドではまず最初に EnemyData 内にアニメーションの情報があるか確認を行い、Null によるエラーを防止します。
その上で、Animetor コンポーネントの Controller の情報を AnimatorOverrideController の情報に上書きして差し替えします。
この処理が実装されることにより、各エネミーごとに異なる移動アニメーションが自動的に設定されるようになります。


EnemyController.cs

 <= クリックすると開きます


 スクリプトを修正したらセーブを行います。


5.ゲームを実行して動作を確認する


 ゲームを実行して、エネミーに応じてアニメーションが差し替えられているかを確認します。

 生成された Enemy ゲームオブジェクトのインスペクターから Animator コンポーネント 内の Controller が変化しているかを確認しておきます。


<実装動画>
動画ファイルへのリンク


インスペクター画像



インスペクター画像





 以上でこの手順は終了です。

 次は 発展6 −デバッグモード機能の実装− です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

3Dトップビューアクション(白猫風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます