Unityに関連する記事です

 ポップアップ内に SelectCharaDetail ゲームオブジェクトを複数生成し、CharaData クラスの情報に基づいて、異なる内容のゲームオブジェクトとして振る舞わせます。
生成時には最初に生成された SelectCharaDetail ゲームオブジェクトの情報を初期値としてポップアップ内に設定します。
SelectCharaDetail ゲームオブジェクトをタップ(クリック)すると、選択した SelectCharaDetail ゲームオブジェクト内に管理している CharaData クラスの情報を
ポップアップ内の表示に反映する制御を行います。

 この手順が完成したら、次の手順で、選択しているキャラをタイルマップに配置する処理を実装します。


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


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

手順21 ーキャラ選択用のボタン型ゲームオブジェクトの生成とポップアップ内の表示切り替え処理の実装ー
37.DataBaseManager スクリプトを作成し、CharaDataSO スクリプタブル・オブジェクトを利用できる状態にする
38.PlacementCharaSelectPopUp スクリプトと CharaGenerator スクリプトを修正し、DataBaseManager スクリプトからスクリプタブル・オブジェクトの情報を利用して SelectCharaDetail ゲームオブジェクトを設定する



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

 ・シングルトンデザインパターンによるクラスの作成
 ・スクリプタブル・オブジェクトの活用方法
 ・for 文と Grid Layout Group コンポーネントを利用したインスタンシエイト処理の実装例



37.DataBaseManager スクリプトを作成し、CharaDataSO スクリプタブル・オブジェクトを利用できる状態にする

1.設計


 この手順では、配置するキャラを選択するボタンの自動生成に加えて、スクリプタブル・オブジェクトを利用して1つのプレファブから異なるキャラの配置用のボタンを作り出す方法を学習していきます。



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

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

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

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


2.DataBaseManager スクリプトを作成する


 スクリプタブル・オブジェクトは今後も増えていく可能性がありますので、特定のクラスに専属で管理をさせることにより、
すべての処理をそのクラス経由で参照する設計にします。

 そのためのクラスとして DataBaseManager クラスをシングルトンデザインパターンとして作成しておきます。


DataBaseManager.cs

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


 スクリプトを作成したらセーブします。


3.<シングルトンデザインパターンによるクラスの作成>


 シングルトンとは、数多くあるデザインパターンの1つです。
そのクラスのインスタンスが必ず1つであることを保証するデザインパターンのことを言います。

 DataBaseManager クラスでは、このシングルトンを採用しています。
つまり、ゲーム中を通じて、この DataBaseManager クラスが1つしか存在できないようになります。
実装例は複数ありますが、一番読みやすい方式で記述しています。



<シングルトンデザインパターンのクラスの作成方法>
    public static DataBaseManager instance;  // クラス名と同名の型を static で宣言する

    private void Awake() {
        if (instance == null) {
            instance = this;
            DontDestroyOnLoad(gameObject);
        } else {
            Destroy(gameObject);
        }
    }



 ポイントは、自分自身の DataBaseManager 型を static 修飾子付きの instance 変数として宣言していることです。
この instance 変数が DataBaseManager クラス自身が代入された情報として利用することになります。

 Awake メソッドを利用して、instance 変数が null (空っぽ) である場合には、DataBaseManager クラス(this)を代入します。
次の DontDestroyOnLoad メソッドは Unity が用意しているメソッドで、引数に指定されたゲームオブジェクトはシーン遷移をしても破壊されてないゲームオブジェクトになります。
この DontDestroyOnLoad メソッドはシングルトンデザインパターンにする際に一緒に用いられることが多いです(この DontDestroyOnLoad メソッド機能自体はシングルトンへの関連はありません)。

 そして instance 変数が null ではない場合、つまり、2つ目以降の複数の DataBaseManager クラスが存在する場合には、その DataBaseManager クラスのゲームオブジェクトを Destroy します。
この手順により、DataBaseManager クラスがアタッチされているゲームオブジェクトが常にヒエラルキー上に1つしか存在しない状態を作り出しています

 このシングルトンによってインスタンスが1つか生成されないことが保証されますので、
逆説的に考えると、この DataBaseManager クラスへの参照は、いずれのクラスからであっても変数を介さずに参照を行えるようになります。



 例えば、NonPlayerCharacter というクラスがあり、その NonPlayerCharacter クラスを持つゲームオブジェクトが5つあった場合、
どの」NonPlayerCharacter クラスであるかを確定できないと、対象となる NonPlayerCharacter クラスへは参照できません。
そのため、NonPlayerCharacter 型の変数を用意して、その変数へ参照したい NonPlayerCharacter クラスを代入することによって、
はじめて NonPlayerCharacter クラスの情報を扱うことができるようになります。これが情報を扱う際の基本的な処理になります。

 ですがシングルトンである DataBaseManager クラスの場合には、このインスタンスは常に1つしかないことが保証されていますので、
どの」という指定の部分が不要になります。よってクラスの特定ができているため、変数への代入が不要になります。
DataBaseManager という指定はすなわち、自動的にただ1つの DataBaseManager クラスの参照が行われることになるためです。

 この機能を利用して DataBaseManager クラスを作成しておくことで、どのクラスからでも参照しやすい設計にしておきます。


4.DataBaseManager ゲームオブジェクトを作成し、DataBaseManager スクリプトをアタッチして設定を行う


 ヒエラルキーの空いている場所で右クリックをしてメニューを開き、Create Empty を選択します。
新しいゲームオブジェクトが作成されますので、名前を DataBaseManager に変更します。

 このゲームオブジェクトに、先ほど作成した DataBaseManager スクリプトをドラッグアンドドロップしてアタッチしてください。


ヒエラルキー画像



 アサイン情報が表示されていますので、Datas フォルダ内にある CharaDataSO スクリプタブル・オブジェクト(スクリプトではないアセットの方)を
ドラッグアンドドロップしてアサインしてください。これでゲーム内でスクリプタブル・オブジェクトの情報を参照して利用することが可能になりました。



インスペクター画像



 以上で設定は完了です。


38.PlacementCharaSelectPopUp スクリプトと CharaGenerator スクリプトを修正し、DataBaseManager スクリプトからスクリプタブル・オブジェクトの情報を利用して SelectCharaDetail ゲームオブジェクトを設定する

1.設計


 DataBaseManager スクリプトにキャラ用のデータベースである CharaDataSO スクリプタブル・オブジェクトを登録しました。
これでこの情報をゲーム内に運用できるようになりましたので、スクリプタブル・オブジェクトにあるキャラの情報群を利用して、キャラのボタンの設定を行う処理を実装します。

 これらの実装が完成したら、前回の手順で SelectCharaDetail スクリプト内にコメントアウトしてある処理のコメントアウトを解除します。


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


 キャラのボタンを押すたびに、そのボタンにアタッチされている SelectCharaDetail クラス内で管理している CharaData クラスの情報をポップアップ内に反映する機能を実装します。
制御する機能が多いため、多くの変数を追加することになります。変数名とアサインするゲームオブジェクトの名称を同じにしておくと分かりやすくなります。


PlacementCharaSelectPopUp.cs


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

 続いては PlacementCharaSelectPopUp ゲームオブジェクトの設定を行いたいのですが、
今回新しく PlacementCharaSelectPopUp スクリプトの SetUpPlacementCharaSelectPopUp メソッドの引数を追加しているため、
その呼び出し命令が書いてある CharaGenerator スクリプト側にエラーが表示されます。

 そのため、先に CharaGenerator スクリプトを修正し、コンパイルエラーがなくなってから、各変数にアサインを行うようにします。


3.CharaGenerator スクリプトを修正する


 キャラを生成するための情報を List に入れて管理を行うように、変数の追加を行います。
こちらの List には、DataBaseManager クラスにある CharaDataSO スクリプタブル・オブジェクトを参照して、実際に登録されている CharaData を取り込み、利用できるようにします。
この処理もメソッドとして準備しておくようにします。処理単位でまとめていくことを覚えていきましょう。

 TODO の処理の実装を行いながら、CharaData を反映して配置用のキャラのデータをポップアップへと引数を利用して情報を渡すようにします。
この処理により、ポップアップ内でボタン用のデータの情報が届くようになりますので、各ボタンの情報に CharaData を1つずつ反映させてボタンを生成することが出来るようになります。

 処理の全体の流れを把握しながら実装を行っていくようにしてみてください。
PlacementSelectCharaPopUp スクリプトとの繋がりをしっかりと理解しておくことが必要になります。
 

CharaGenerator.cs

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


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


4.CharaGenerator ゲームオブジェクトの確認を行う


 新しく追加した CharaDatasList 変数が表示されていることを確認します。
Size は 0 のままで問題ありません。ゲームを実行した際に CreateHaveCharaDatasList() メソッドが実行されて
こちらに CharaDataSO スクリプタブル・オブジェクトに登録されているすべての CharaData が順番に登録されることになります。


インスペクター画像



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


 新しく宣言した変数がたくさんありますので、間違えないようにアサインを行ってください。
ゲームオブジェクトの名称と変数名を同一にしておくことにより、アサイン先を分かりやすくでき、かつ、アサイン間違えを防止することに役立ちます。
そういった部分も考えながら名称については準備してください。


インスペクター画像




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


 ゲームを実行した際に、どの処理が、どのように動いていることで、ポップアップ内に
配置用のキャラのボタンが並んで生成されるようになっているのかを分かった上で確認していくようにしましょう。

 CharaGenerator クラスの List には、DataBaseManager クラスの CharaDataSO スクリプタブル・オブジェクトを参照して、
登録されている CharaData の List が作成されるようになります。

 この情報をポップアップに渡すことにより、ポップアップが表示された際に、同じキャラのボタンでありながらも
異なる画像や情報を持つボタンが List の数分だけ生成されていることが分かります。

 PlacementSelectCharaPopUp ゲームオブジェクト内の Content ゲームオブジェクトの子オブジェクトとして
SelectCharaDetail ゲームオブジェクトが複数生成されてボタンとして表示されていますので、そちらもヒエラルキーから確認をしておくことで
スクリプトの処理を理解する助けになります。


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



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




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

 次は 手順22 −ポップアップ内で選択しているキャラの生成処理の実装− です。

コメントをかく


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

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

Menu



プログラムの基礎学習

コード練習

技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

3D脱出ゲーム(抜粋)

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

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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