i-school - アイテムの生成や効果内容にスクリプタブル・オブジェクトを利用する

設計


 引き続き、スクリプタブル・オブジェクトを利用した処理の実装を行っていきます。

 前回の手順はこちらです。

  => アイテムの情報をスクリプタブル・オブジェクトに登録して利用する


実装手順


 以下のような順番で実装を行っていきます。

〇1.アイテムの情報を設計する
〇2.スクリプタブル・オブジェクト用の ItemDatasList スクリプトを作成する
〇3.【2】のスクリプタブル・オブジェクトを元に、スクリプタブル・オブジェクトのアセットを作成する
〇4.スクリプタブル・オブジェクトにアイテムの情報(値)を登録する
 5.スクリプタブル・オブジェクトを管理する DataBaseManager スクリプトを作成する
 6.ItemBase スクリプトを作成する
 7.Item_RecoveryLife スクリプトを作成する
 8.アイテムのプレファブに ItemNo を設定する

 今回の手順では、【5】〜【8】までを扱います。


5.スクリプタブル・オブジェクトを管理する DataBaseManager スクリプトを作成する


 完成したスクリプタブル・オブジェクトは、いずれかのスクリプトで管理を行う必要があります(アセットの扱いですが、スクリプトに変数として宣言できます)

 設計としてましては「生成されたアイテムの ItemBase スクリプトが、自分のアイテムのデータを確認しにいって、スクリプタブル・オブジェクトから情報をもらう」という処理にしたいと思います。

 そこで、どのアイテムからでもアクセスしやすいスクリプトであった方が利便性が高くなります。
またこのようにアクセスするスクリプトを1つにしておくことでアイテム1個ずつにスクリプタブル・オブジェクトを登録する必要もなくなります。

 そのためスクリプタブル・オブジェクトを管理する DataBaseManager スクリプトはシングルトンで作成するようにして、アイテムからアクセスが容易な状態で作成を行います。

 C#スクリプトを新しく作成し、名前を DataBaseManager に変更します。
すでにある場合には処理を追加していきましょう。


DataBaseManager.cs

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




 DataBaseManager は名前のごとく、ゲーム内に登録する情報を一元管理させるための役割を持っています。
現在は、アイテムの情報のデータベース(リスト)であるスクリプタブル・オブジェクトを管理しています。

 処理の内容ですが、GetItemDataFromItemNo メソッドを ItemBase スクリプト内で実行してもらい、
その際に、引数を通じて、アイテムの ItemNo の情報を受け取ります。

 その ItemNo 変数の情報と、ItemDataSO スクリプタブル・オブジェクト内にある各 ItemData の ItemNo を1つずつ順番に照合していき、
同じ番号の ItemNo が見つかったら、その ItemData をアイテムの情報として ItemBase へと提供します。
GetItemDataFromItemNo メソッドが戻り値に ItemData 型を設定しているのはそのためです。



 スクリプトが完成しましたら、ヒエラルキー上で Create Empty を選択して、新しくゲームオブジェクトを作成します。
名前を DataBaseManager に変更します。

 このゲームオブジェクトに DataBaseManager スクリプトをアタッチしてください。
インスペクターを確認し、スクリプトがアタッチされていることを確認できましたら、
ItemDataSO 変数に Datas フォルダにある ItemDataSO スクリプタブル・オブジェクトをアサインしましょう。


 完成すると、次のような画像の状態になります。

インスペクター画像


 以上で設定は完了です。


6.ItemBase スクリプトを作成する

 
 プレハブのアイテム用のゲームオブジェクトにアタッチするための、親クラスとして ItemBase スクリプトを作成します。
新しく ItemData 型の itemData 変数を追加して、アイテムの情報をスクリプタブル・オブジェクトから取得して、ItemBase 内で利用できる状態にします。

 itemData 変数にスクリプタブル・オブジェクトから情報を取得するタイミングは
SetUpItem メソッド内にある TODO の部分を実装していきますので、自分で処理を考えてから教材を確認してみましょう。

<ItemData を取得するための、スクリプタブル・オブジェクト内の検索・照合の流れ>
 ItamBase では、ItemData の情報が欲しい。それは ItemDataSO スクリプタブル・オブジェクトに登録されているデータになる
   ただし、データベースなので、「どの」ItemData が欲しいかを、検索して照合しなければ、欲しい ItemData が見つからない。

    => ItemBase に新しく追加した itemNo 変数を使う。この値を DataBaseManager に作成したメソッドを実行する際に、引数として送る

     =>  DataBaseManager に登録されている ItemDataSO から、引数として届いた値をつかい ItemNo でスクリプタブル・オブジェクトの各 ItemData を照合する

     =>  スクリプタブル・オブジェクト内を照合したみつかった ItemData を ItemBase に提供する

 この流れをイメージしてください。

 また、エフェクトの生成についても、なぜ親クラスにエフェクトの生成処理を記述するのか、
どのようにエフェクトのプレファブを使って、アイテムごとに異なるエフェクトを生成しているのか、という部分を考えてみてください。

 完成できたら、SE についても再生できるようにチャレンジしてみてください。



ItemBase.cs

<= +ボタンを押すと開きます。親クラスとして共有化する情報はプロジェクトにより異なります。自分のプロジェクトに合ったものにアレンジしましょう。



7.Item_RecoveryLife スクリプトを作成する


 アイテムの種類の数だけ、ItemBase クラスを継承した子クラスを用意します。
ここではサンプルとして、回復アイテム用の Item_RecoveryLife クラスを作成します。

 【6】の手順で作成した ItemBase クラスを継承して、Item_RecoveryLife クラスを子クラスとして作成します。

 クラスを継承すると、protected と public 修飾子で定義されている変数とメソッド、プロパティは自動的に実装されます。
このうち、処理の上書きを行いたいメソッドやプロパティのみを子クラスに定義します。

 今回であれば、回復の効果を作りたいため、TriggerItem メソッドだけを記述しています。
このようにすることで、同名のメソッドの振る舞いを変えることが出来ます。



Item_RecoveryLife.cs

<= +ボタンを押すと開きます。親クラスとして共有化する情報はプロジェクトにより異なります。自分のプロジェクトに合ったものにアレンジしましょう。



8.アイテムのプレファブに ItemNo を設定する


 回復アイテムのプレハブに Item_RecoveryLife スクリプトをアタッチします。親クラスはアタッチする必要はありません。
Item_RecoveryLife スクリプトには ItemNo 変数があります。

 これでスクリプタブル・オブジェクトを使用する準備が整いましたので、最後にアイテムのプレファブに ItemNo を設定します。
この ItemNo と ItemDataSO スクリプタブル・オブジェクト内にある ItemData の ItemNo と ItemBase 内の ItemNo を照合しますので、
同じ番号を設定しておく必要があります。

 例えば回復アイテムのデータをスクリプタブル・オブジェクトの ItemNo 0 に登録しておきます。
そして回復アイテムである Item_RecoveryLife ゲームオブジェクトのプレファブを開いて、Item_RecoveryLife スクリプト内の ItemNo に 0 を設定します。
これは、回復アイテム用のデータが、ItemDataSO スクリプトの Element 0 に登録されている、ItemData の ItemNo が 0 であるので
それに合わせているためです。


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



ItemDataSO スクリプタブル・オブジェクトのインスペクター画像



 以上で設定は完了です。


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


 回復アイテムのゲームオブジェクト(プレファブ)からは、回復量の設定値自体はなくなっていますが、
代わりに ItemDataSO スクリプタブル・オブジェクトに登録されている回復アイテム用のデータが参照されるようになっています。
そのため回復量を調整したい場合には、回復アイテムのゲームオブジェクトではなく、スクリプタブル・オブジェクトの値を調整することで設定が可能になります。

 実際に正常に動作するかを、ゲームを実行して確認してみてください。

 敵を倒した際に生成された回復アイテムの回復する量が ItemDataSO スクリプタブル・オブジェクトの設定値であれば、制御成功です。
改めてスクリプタブル・オブジェクトの値を変更して、回復量が変化するかを確認しておいてください。


他のアイテムを追加する


 同じ要領で、アイテムを追加できます。

 ItemBase スクリプトを継承したアイテム用のスクリプトを作成して、それを新しいアイテムにアタッチします。

 また、スクリプタブル・オブジェクトにも、新しく追加したアイテムのデータを追加します。

 利用したい ItemData の ItemNo の値と、プレハブの ItemNo を一緒にすることを忘れないようにしてください。
この番号により、効果が変化します。



 この手順は以上です。