Unityに関連する記事です

 エネミー用のプレファブと EnemyDataSO スクリプタブル・オブジェクトを利用し、クローンされたエネミーのゲームオブジェクトにエネミーのデータを設定し、
同じプレファブから異なるデータを持つエネミーを自動的に生成する処理を実装します。

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

発展2 −エネミー用のデータベースの利用−
 3.EnemyController スクリプトを修正し、EnemyDataSO スクリプタブル・オブジェクトのデータを参照して反映する処理を追加する
 4.DataBaseManager スクリプトと EnemyGenerator スクリプトを修正し、エネミー用のプレファブに EnemyDataSO スクリプタブル・オブジェクトのデータを参照して、1つのプレファブから異なるエネミーを自動生成する処理を追加する


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

 ・スクリプタブル・オブジェクトを利用する方法(復習)



3.EnemyController スクリプトを修正し、EnemyDataSO スクリプタブル・オブジェクトのデータを参照して反映する処理を追加する

1.設計


 まずは最初に実装動画を確認してください。

 生成されるエネミーが、スクリプタブル・オブジェクトに登録したエネミーの画像を持ったゲームオブジェクトとして生成されています。
これは複数のエネミー用のプレファブを用意しているのでなく、今までと同じエネミー用のプレファブを利用していますが、
エネミー用のプレファブにエネミーの情報(EnemyData)を設定することによって、1つのエネミー用のプレファブから異なるエネミーを作成しています。
ボスも同様です。

 この手順では、エネミーの自動生成に新しい処理を追加して、スクリプタブル・オブジェクトを利用して1つのプレファブから異なるエネミーを作り出す方法を学習していきます。



 EnemyDataSO スクリプタブル・オブジェクトにエネミーのデータを登録しました。
スクリプタブル・オブジェクトは、スクリプト内に同名の型名で変数を作成することで利用することが可能になります。

<スクリプタブル・オブジェクトを利用できる状態にする>
  public EnemyDataSO enemyDataSO;

 上記のように変数として宣言することにより、変数を利用してスクリプタブル・オブジェクトの情報をゲーム内に利用することが出来ます。

 宣言の方法は他の変数と変わりません。また、public 修飾子にして宣言しておくことにより、
インスペクターより登録が出来る他、外部のスクリプトからも参照して利用することが可能です。これも他の変数と同じです。



 現在、エネミーのデータとしてゲーム内で利用されている情報は、EnemyController スクリプトにある、以下の2つの情報です。

    [SerializeField, Header("移動速度")]
    private float moveSpeed;

    [SerializeField, Header("最大HP")]
    private int maxHp;

   [Header("エネミーのHP")]       
   public int hp;            

   [Header("エネミーの攻撃力")]      
   public int attackPower; 

 いままではこちらの変数に対してインスペクターより設定を行って数値を決めていました。
今回の設計ではエネミー用のプレファブのゲームオブジェクトは1つしかありません。
よってエネミーのゲームオブジェクトをプレファブのクローンとして生成すると、常に同じ hp と攻撃力を持っているエネミーが生成されていました。
 


 この設定の部分に、今回作成した EnemyDataSO スクリプタブル・オブジェクトのエネミーのデータを利用するように処理の変更を行います。
生成されるクローンのゲームオブジェクトは同じですが、その内容・情報に対して、エネミーのデータを反映することによって、生成されたエネミーの振る舞いを変更します。

 この処理を自動化して、生成されたときにエネミーのデータの情報に合わせて、エネミーとしての振る舞いも自動的に変わるようにします。

 このような設計にすると、1つのプレファブから、エネミーのデータベースに登録されているすべてのエネミーを作り出すことが可能になります。


2.EnemyController スクリプトを修正し、EnemyDataSO スクリプタブル・オブジェクトのデータを参照して反映する処理を追加する


 設計に基づいて、インスペクターで設定していた情報を EnemyDataSO スクリプタブル・オブジェクトの EnemyData クラスの情報を参照するように変更します。

 まずは EnemyData クラスの情報を扱えるように、EnemyData 型の変数を用意します。この変数に、エネミーとして必要なすべてのデータが入ることになります。
hp、攻撃力、そしてエネミーの画像の情報などが入っていますので、このデータを利用することで「どのようなエネミーとして振る舞うか」決まります。
この変数を利用することによって、EnemyData クラスの情報を参照して利用出来るようになります。

 この EnemyData クラスの情報は、外部のスクリプトから引数で受け取るように設計します。
いままで SetUpEnemyController メソッドを利用して外部の情報を受け取っていたましたが、
さらに EnemyData 型を宣言を追加して、ここでエネミーのデータを受け取れるようにします。

 ここで大切なポイントがあります。
 EnemyData クラスの情報を決定するのは、EnemyController スクリプト側ではありません
EnemyController スクリプトでは、引数として届いた EnemyData クラスの情報を利用して、設定を行うことで、エネミーのデータを反映してエネミーに役割を与えることが仕事です。

 生成されたエネミーのクローンに対して、エネミーのデータを決定し、「この情報を使ってエネミーに役割を与えて振る舞いを変えてください」と命令を出すのは EnemyGenerator スクリプト側になります。

 この役割分担の考え方についてもしっかりと学習して理解を深めてください。



 引数を通じてうけとった EnemyData の情報を活用するように処理を追加することで、
EnemyData クラスに含まれている情報については、このスクリプト内で個別に設定を行う必要がなくなります。
よって、攻撃力や移動速度といった情報を EnemyData 型の情報から自動的に参照する処理の記述が必要になります。

 EnemyData クラス内の変数はすべて public 修飾子によって宣言されています。
そのため、EnemyData クラスの情報を取得している変数は、これらの public 修飾子の変数の情報をすべて利用できます。
例えば、EnemyType を参照したい場合には以下のようになります。

  // EnemyData クラスに登録されている EnemyType の情報が、Boss の列挙子である場合
  if(enemyData.enemyType == EnemyType.Boss) {  }


 以前に学習したように、変数に代入されている情報からは、public 修飾子の情報をさらに取得して利用できます。
ピリオドを使った処理について、この機会にしっかりと覚えていきましょう。


EnemyController.cs

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


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



 Prefabs フォルダにある Enemy ゲームオブジェクトのインスペクターを確認します。
新しく public 修飾子で宣言した EnemyData 変数が追加されています。


Enemy ゲームオブジェクト インスペクター画像

EnemyData 変数はすべて初期値のままで構いません。
ゲームを実行してエネミーが生成されると、ここに EnemyData の情報が代入されるようになります。

 Debug を行う際に役立ちますので、どの処理によって、どの値が変化するのかを念頭に置いておくことが重要です。


4.DataBaseManager スクリプトと EnemyGenerator スクリプトを修正し、エネミー用のプレファブに EnemyDataSO スクリプタブル・オブジェクトのデータを参照して、1つのプレファブから異なるエネミーを自動生成する処理を追加する

1.設計


 EnemyController スクリプトの修正が終わり、EnemyDataSO スクリプタブル・オブジェクトのデータを反映して利用できる準備が完了しました。

 つづいて、EnemyGenerator スクリプト内に EnemyDataSO スクリプタブル・オブジェクトのデータを扱えるようにし、
そのデータを利用して、生成したエネミーのクローンにエネミーのデータを送り渡す処理を修正・追加を行います。

 前の設計で説明したように、スクリプタブル・オブジェクトも作成しただけでは利用できません
利用するためには EnemyDataSO 型の変数を宣言し、その変数にスクリプタブル・オブジェクトを代入して、参照して利用していく方法になります。

 EnemyGenerator スクリプトにスクリプタブル・オブジェクトの情報を扱えるということは、
このスクリプトにおいて生成したエネミーのクローンに対して、エネミーとしての振る舞いを決定する部分までが実装される設計になります。
そしてそのエネミーの情報を EnemyController スクリプト側に渡すことで、EnemyController スクリプトがエネミーの情報を設定してくれる処理の流れになっています。

 そのためには事前準備として多くの処理の実装が必要になります。

<ロジックの流れ>
〇1.EnemyGenerator スクリプトにおいて、エネミーのプレファブからクローンの生成を行う
◇2.エネミーのデータベース(EnemyDataSO スクリプタブル・オブジェクト)の中からランダムなエネミーのデータを1つ選択して、それを生成したエネミーのクローンの「エネミーの情報(EnemyData)」として決定する
△3.EnemyController スクリプトの SetUpEnemy メソッドに【2】で決定したエネミーの情報を引数として渡す
〇4.EnemyController スクリプトの SetUpEnemy メソッドにおいて、引数で取得したエネミーの情報を利用して、エネミーとしての振る舞いを設定する

 ◇の部分は新しく実装する変数や処理、〇は実装済の処理、△は修正を行う処理になります。

 エネミーの情報は、ランダムなエネミーのデータを1つ選択して、今回生成するエネミーの情報(EnemyData)として決定します。
 
 その後、生成されたエネミーのクローンのゲームオブジェクトより、EnemyController スクリプトの SetUpEnemy メソッドを実行する部分を修正します。
引数を新しく1つ追加して EnemyData の情報を EnemyController へと渡せるようにします。
このメソッドはすでに修正済ですので、この修正によって、EnemyGenerator スクリプトにおいて決定した
エネミーの情報が EnemyController スクリプト側へと引数を通じて送信されることになります。



 以上がロジックの流れになります。
今まで以上にプログラムの処理の理解を深めていくことが重要になります。


2.DataBaseManager スクリプトを修正する


 EnemyGenerator スクリプトが EnemyDataSO スクリプタブル・オブジェクト の情報を活用できるようにするため、
EnemyDataSO スクリプタブル・オブジェクトを DataBaseManager において扱える状態にします。


DataBaseManager.cs

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


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


3.DataBaseManager ゲームオブジェクトの設定を行う


 新しく追加した変数に EnemyDataSO スクリプタブル・オブジェクトを登録することができますので、
Datas フォルダにある EnemyDataSO スクリプタブル・オブジェクトをドラッグアンドドロップしてアサインしてください。


DataBaseManager ゲームオブジェクト インスペクター画像


 これで EnemyDataSO スクリプタブル・オブジェクトの情報をゲーム内で活用できるようになりました。

 以上で設定は完了です。


4.EnemyGenerator スクリプトを修正する


 設計に基づいて処理のロジックを組んでいきます。
設計で提示したロジックの流れと実装していく内容を1つずつ確認しながら、処理の内容を理解していきましょう。


EnemyGenerator.cs

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


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


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


 すべての実装が完了しましたので、ゲームを実行して順番に処理の内容を確認していきます。
 
 エネミーが生成されたら、ゲームを一時停止して、Enemy ゲームオブジェクトのインスペクターを確認してください。
時間の経過で自動生成されるエネミーは同じ Enemy ゲームオブジェクトですが、それぞれの EnemyData に基づいたエネミーとして振る舞っていれば制御成功です。
Hp や 攻撃力などの各値を確認してみてください。


<ヒエラルキー画像(すべて Enemy プレファブのクローン)>



<EnemyController スクリプトの EnemyData の値がそれぞれ異なり、この情報を設定して異なるエネミーとして振る舞っている>





 なお、エネミーのアニメーションについては、まだ変更用のデータや設定を反映する処理がないため、現在は変わりません。
こちらは発展5 −エネミーのアニメーションの自動設定機能の実装−において実装を行います。


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

 次は 発展3 −キャラの配置を解除するためのポップアップの作成− です。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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