Unityに関連する記事です

 ベルトスクロールアクションでは各エリア単位で敵が生成されます。引き続き、このロジックを設計していきます。



設計


 前回の手順で、敵が自動生成を繰り返すサイクルが実装されました。
この手順では生成された敵の情報をListで管理し、エリア内の敵の状態を把握できるようにします。

 エリアが開始された際、Listをリセットします。
 敵が生成された際には、Listに敵の情報を追加します。
 敵が倒された場合にはListから削除し、エリア内で討伐された数を加算します。

 このListの情報を元に、次の手順ではエリアのクリア状態とゲームの進行状態とを紐づけて管理を行えるようにします。


実装の手順


 1.GameManagerクラスを修正する ーListを用意してエリア内の敵の情報を管理できるようにするー
 2.Enemyクラスを修正する
 3.StageListスクリプタブル・オブジェクトに出現する敵の情報を登録する
 4.GameManagerクラスを修正する ーStageListと各データを同期させるー
 5.ゲームを実行して動作を確認する


新しく学習する内容


 ・Listの使い方(Clearメソッド、Addメソッド、Removeメソッド)


1.GameManagerクラスを修正する ーListを用意してエリア内の敵の情報を管理できるようにするー


 新しく変数を2つ追加します。敵の情報を管理するための enemyList 変数と、エリア内の敵の討伐数をカウントする destroyConut 変数です。

 ListはEnemyクラスで用意します。これはインスタンシエイトされて生成された敵の情報が Enemy クラスに代入されるため、
その情報をそのままListへ追加できるようにするためでもあり、敵の管理をEnemyクラスで行うようにするためでもあります。

 GameObject型ではなく、Enemyクラスで管理する利点としまして、クラスの場合には gameObject 変数を利用してGameObject型へのアクセスもすぐにできるためです。
逆にGameObject型で管理をしてしまうと、Enemyクラスを利用するためには毎回GetComponent処理が必要になります。

 そのため、何かをまとめて管理する場合には、ただまとめるだけではなく、その情報をすぐに利用しやすい形にしてList化しておく設計が重要になります。


GameManager.cs

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



<Listの使い方(Clearメソッド、Addメソッド、Removeメソッド)>


 Listクラスは<T>にジェネリック型(任意の型)を指定して、同じデータ型をまとめて管理するコレクション機能を持つクラスです。
配列と異なり、要素を自由に追加・削除できます。(要素数が可変する)
Listを利用する場合には配列と同様に初期化が必要ですが、Listでは初期化時に要素数の宣言が不要です。

 そのため、予め要素数の確定しているデータを扱う場合には配列を、要素数が未確定であったり可変長であるデータについてはListを利用するようにします。

 ここでは今回利用しているListクラスの持つメソッドについて説明します。


List.Clear()


 List内のすべての要素を削除します。Clearメソッドには引数はありません。

 enemyList.Clear();


List.Add(T型)


 Listの末尾に引数で指定した要素(データ)を追加します。Listで宣言している型と同じ型であればAddすることが出来ます。

  Enemy enemy = Instantiate(enemyPrefab, generatePos, Quaternion.identity);

  enemyList.Add(enemy);   // List<Enemy>型なので、enemy 変数の型が Enemy型であればAddできる


List.Remove(T型)


 List内にある要素から、引数で指定した要素を削除します。こちらも同じ型である必要があります。

  public void RemoveEmenyList(Enemy enemy) { 

  enemyList.Remove(enemy);   // List<Enemy>型なので、enemy 変数の型が Enemy型であればRemoveできる

 他にも便利なメソッドがありますので、調べてみてください。

参考サイト
ITSakura様
C# Listの使い方のサンプル
https://itsakura.com/csharp-list


2.Enemyクラスを修正する


 敵が倒された際に、GameManagerクラスのRemoveEmenyListメソッドを呼び出すようにして、敵の管理用のListから敵の情報を削除するようにします。
こうすることで敵の生成と削除の両方がListを使って管理できるようになります。

Enemy.cs

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



3.StageListスクリプタブル・オブジェクトに出現する敵の情報を登録する


 ステージ1のエリア1について、出現する敵の情報を登録します。

 StageListスクリプタブル・オブジェクトの、StageDatas Element[0] / AreaDatas Element[0] 内にある AppearNum の Size を 0 から 3 に変更します。
このAppearNumが出現する敵の種類と数を登録する部分です。

StageListスクリプタブル・オブジェクトのインスペクター画像 ヽ層表示



 敵の種類はまだ1つしかありませんので、Element 0 -2 の数字はすべて 0 で登録します。
これは、敵のプレファブを管理する配列の、 0 番目の要素数にある敵を生成する、という敵の種類を決定する処理に利用します。
 
 Elementの数が出現する敵の数です。今回は Size 3 ですので、3体の敵が生成されることになります。


StageListスクリプタブル・オブジェクトのインスペクター画像◆AppearNum部分のみ



4.GameManagerクラスを修正する ーStageListと各データを同期させるー


 登録した敵の情報をゲーム内に反映して利用するために、GameManagerクラスを修正します。

 敵のプレファブ情報を単体からListに変更し、複数の敵のプレファブを登録できるように変更します。
 
 エリアの情報を使い、敵の生成数と討伐数を比べて、エリア内のすべての生成された敵を倒している場合には、エリアクリアとするように処理を追加しておきます。
ただしこのとき、討伐数と生成数とを単純に比べてしまうと、エリア内ですべての敵を倒していない状態でもエリアクリアと判定してしまうため
エリア内のすべて敵の生成が終了し、かつ、すべての敵を討伐している場合に限り、エリアクリアとなるように制御を行います。
詳細は次の手順で記載するので、ここでは判定し、デバッグでクリアと表示だけするようにします。


GameManager.cs

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



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


 GameManagerゲームオブジェクトのインスペクターを確認し、EnemyPrefabs変数のSizeを変更して、生成する敵のプレファブを登録します。
まだ1体しか敵のプレファブがなければ Size 1 にして、いままで使用していたのと同じように敵のプレファブを1体だけ登録します。増えたらSizeを変更して追加します。


GameManagerゲームオブジェクトのインスペクター画像 EnemyPrefabs Size 0(一番下の項目。未設定)


GameManagerゲームオブジェクトのインスペクター画像◆EnemyPrefabs Size 1 にして、Enemy用ゲームオブジェクトをProject内からアサインしている状態



 ゲームを実行して、動作を確認します。

 生成された敵がEnemyListに追加されるか確認します。

 Enemyはデバッグモードのままのため、生成後に自動的に破壊されます。
その際にEnemyListから削除されているか、またDestroyConutが加算されているかを確認します。

 エリアの敵の生成数である AppearNum の Size 3 と、DestroyConutの値が同じ 3 になった際に、Debug.Logに エリア クリア の文字が表示されるか確認します。
GenerateCount が 3 未満の際に(エリア内のすべての敵の生成が終了していない)、エリア クリア が出てしまわないかも合わせて確認します。


検証動画 ‥┐破壊されたときに、EnemyListからの削除とDestroyConutの加算を確認する
https://gyazo.com/52e62090b3d5369d6cf98cd0c0633ad3


検証動画◆,垢戮討療┐寮言が終了している状態で敵が破壊されてDestroyConutが生成数と同じ値になったときに、Debug.Logに エリア クリア と表示される
https://gyazo.com/4508012e4adfd6aabb52bef83af67a24


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

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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