Unityに関連する記事です

ーバルーンの管理方法を変更ー


 次の手順で、バルーンを切り離す処理を実装するにあたり、配列変数で管理しているバルーンを、List(リスト)での管理に変更します。

 この手順は内部的な構造の変更であるため、ゲームの挙動には何も影響を与えません。そのため、デバッグする際には、以前と同じ挙動が行えるかどうかを基準に判断を行います。


 ・バルーンの管理を配列からListに変更する



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

 ・Transform.childCount 変数
 ・Listの使い方 (宣言、初期化、Add メソッド、Remove メソッド)


1.設計


 配列は一度長さ(要素数の最大値。Length で取れる値)を設定すると、基本的に初期化を行うまでは、その値が空になっても長さが変化しません。
例えば、Length が 2 である配列は、要素番号 0 と 1 を持っていることになりますが、この中身(要素)の値のある、なしに関わらず、Length は常に 2 を取得します。
そのためいままでは、配列の要素番号ごとの要素を確認し、空(Null)であるのか、あるいは値があるのかによって処理の制御を行ってきました。

 次の手順以降では、この管理方法ですと、バルーンの管理が難しくなるため、このタイミングで、管理方法を配列から List に変更します。



 ここでは、バルーンの管理を行っていた配列の部分を List に変更し、動的に要素数の長さを変更できるようにします。
配列と異なり、List は追加・削除を行うことで、その長さが動的に変化しますので、最大値を取得した場合には、現在の要素の最大値を取得できます。

 PlayerController スクリプトの配列の宣言、および利用している部分を削除し、すべて List の処理に書き換えます。


2.PlayerController スクリプトを修正して、配列処理をList処理に変更する


 宣言フィールドでは配列の代わりに Ballon 型の List の宣言と初期化を行い、バルーンの管理を行えるようにします。
public 修飾子にて宣言しているため、インスペクターより要素の内容を確認することが可能です。

 また GameObject 型で宣言して利用していたバルーンのプレファブを、Ballon 型の宣言に変更します
これはバルーンを管理するための List を Ballon 型で用意していますので、それに合わせるための処理であるとともに、
自作クラスでのインスタンスを行えるようにして、インスタンスしてすぐにメソッドの実行を行えるようにするためです。

 自作クラスでのインスタンスについて分からない場合には、=> 手順21を復習しておいてください。
GameObject 型でインスタンスする場合と自作クラスでのインスタンスの場合の違いと、どのような場合に利用するのかを把握して処理の実装を行ってください。

 コレクションの長さを取得する方法として、配列の場合は Length を利用していましたが、List は現在の長さ(最大値)を Count 変数によって取得することができます。


PlayerController.cs

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



 スクリプトの修正が終了したら、Yuko_Player ゲームオブジェクトのインスペクターを確認します。
PlayerController スクリプトに新しく宣言した変数が表示されていれば問題ありません。


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



3.<Transform.childCount 変数>


 指定したゲームオブジェクトの持つ子オブジェクトの数を int 型で取得できる変数です。

  if (ballonTrans[0].childCount == 0) {

      // 1つ目のバルーンの生成位置にバルーン生成
      ballon = Instantiate(BallonPrefab, ballonTrans[0]);


 ここでは、ballonTrans 配列の 0 番目の要素番号のゲームオブジェクトの持つ子オブジェクトの数を確認しています。

 条件式の 0 である場合とはすなわち、このゲームオブジェクトは子オブジェクトを持っていない状態を表しますので、
まだバルーンが生成されていない、あるいは生成されたものの、破壊されてしまっている状態のいずれかになります。

 条件式の結果、子オブジェクトがない場合には、このゲームオブジェクトの子オブジェクトとしてバルーンを1つ生成するように制御を行っています。

 このような条件式になっている理由は、先ほどもあったように、破壊されるバルーンが、2つあるうちのどちらになるか、わからないためです。
常に1つ目のバルーンから破壊されるのであれば、破壊された順番通りに生成を行えばいいですが、敵はどちらのバルーンを破壊するかわかりません。

 そのため、破壊された順番や、リストの現在値ではなく、「バルーンの生成されていない位置」で生成を行うことにより、足りない方のバルーンを継ぎ足していくことが出来ます。


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


4.<Listの使い方 (宣言、初期化、Add メソッド、Remove メソッド)>


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


1.Listの宣言と初期化

 List を利用する場合には配列と同様に初期化が可能ですが、Listでは初期化時に要素数の宣言が不要です

<配列の初期化>
  ballons = new GameObject[maxBallonCount];       // <=  要素数の宣言が必要

<List の初期化>
  List<Ballon> ballonList = new List<Ballon>();   // <=  要素数の宣言が不要

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


参考サイト
.net column様
【初期化の方法】C#で配列やリストを初期化するには?
https://www.fenet.jp/dotnet/column/language/713/
 
 続いて、今回利用している List クラスの持つメソッドについて説明します。


2.List.Add(T型) メソッド

 Listの末尾に引数で指定した要素(データ)を追加します。
引数が T 型となっていますが、これは List を宣言した際に使った型が自動的に入ります。
今回は Ballon 型の List を宣言していますので、引数には Ballon 型のみ指定できます。

 Listで宣言している型と同じ型であれば Add メソッドで List に要素を追加することが出来ます

 // 生成された Ballon のクローンを代入するための変数を宣言 
  Ballon ballon;

 // List に追加
 ballonList.Add(ballon);

 追加された要素は、自動的に List の最後に順番に追加されていきます。
例えば、ballonList がまだ1つも要素がなければ、ballonList[0] として1つ目に要素が追加されます。
そのあとに Add メソッドが実行された場合には、ballonList[1] として2つ目に要素が追加されます。


3.List.Remove(T型) メソッド

 Listの中にある、引数で指定した要素(データ)を削除します。
引数が T 型となっていますが、これは Add メソッドと同じで List を宣言した際に使った型が自動的に入ります。
今回は Ballon 型の List を宣言していますので、引数には Ballon 型のみ指定できます。

 Listで宣言している型と同じ型であれば Remove メソッドで List から指定した要素を削除することが出来ます

  // List から ballon 変数の要素を削除
 ballonList.Remove(ballon);

 Remove メソッドでは引数で指定したデータのみをList内から削除しますので、他の要素は削除されません。

 今回の実装ケースでは、バルーンの生成用の GenerateBallon メソッド内で ballonList へバルーンの追加を行い、現在いくつのバルーンが生成されているのか管理を行えるようにします。
また、バルーンの破壊用の DestroyBallon メソッド内で ballonList 内の指定されたバルーンを削除します。


参考サイト
SamuraiBlog 様
【C#入門】Listの使い方総まとめ(ArrayList/Add/Remove/ソート/検索)
https://www.sejuku.net/blog/47378


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


 新しく追加した変数のうち、List 変数である ballonList 変数については、Size 0 のままで問題ありません。
こちらはインスタンスすると自動的に要素が追加されます。

 ballonPrefab 変数については、() の部分が GameObject 型ではなく、Ballon 型の指定になっています。
指定するゲームオブジェクトは同じですが、アサインされる情報が Ballon 型になります。

 Prefabs フォルダにある、Ballon ゲームオブジェクトをドラッグアンドドロップしてアサインしてください。
自動的に Ballon スクリプトが登録されます。


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



 以上で設定は完了です。


6.Ballon スクリプトを修正する


 PlayerController スクリプト内のバルーンを破壊する処理を行う DestroyBallon メソッドについて、引数を追加しましたので
このメソッドの呼び出しを行っている、Ballon スクリプトの処理を変更します。


Ballon.cs

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


 以上でこの手順は完了です。
どのような処理に変更になったのか、PlayerController 側の処理と合わせて確認をしてください。


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


 ゲームを実行して、今までと同じ操作を行ってください。
まず最初はバルーンを生成するまでジャンプできず、バルーンが1つ以上あればジャンプできていれば問題ありません。
バルーンが生成されたらインスペクターより ballonList を確認してください。Size が 0 から 1 になって、生成されたバルーンの情報が
Ballon 型で登録されていれば制御成功です。


<Gameビューとインスペクター画像(バルーン1つ対し、ballonList の要素も1つ)>



<実行動画 バルーンを生成すると ballonList に追加される>
https://gyazo.com/dabc4b620179fd4d60f807b032f24690


<2つ目のバルーン生成時>



<実行動画 2つ目のバルーン生成時>


 空中ではバルーンが生成できないこと、バルーンが2つ(最大値)である場合にもバルーンが生成できないことも、一緒に確認しましょう。




 続いて、敵とバルーンを接触させてください。ballonList の要素の内の1つが削除されて、List の最大値が 2 から 1 に変更されていれば問題ありません。


<実行動画 ballonList の要素の内の1つが削除されて、List の最大値が 2 から 1 に変更される>
https://gyazo.com/259b72ef690fdb5f3159441b666de4d8


 その後にバルーンを生成し、再度、ballonList の要素が1つ追加されて、最大値が 1 から 2 に変更されていれば問題ありません。


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

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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