i-school - 簡易データベースのデータをクラスに反映させる

簡易データベースのデータを使ってアイテムを生成する

 
 基本的な設計は以下のようになります。

1.簡易データベースを作成する。
2.データベースに、アイテムのデータを登録する。
3.アイテムのデータを受け取るItemDetailクラスを作り、データベースの情報を反映したゲームオブジェクトを作成できるようにする。
4.ItemDetailクラスをアタッチするアイテム汎用プレファブを作る。
5.アイテムの生成方法を変更する。
6.多態性について

データベースを利用して汎用的に使う利点


 まず1つとして、データベースを利用することにより、各アイテムごとのデータの修正・管理がしやすくなります。
ここで設定した情報がゲーム内に反映されます。アイテムのプレファブを1つずつ開いて、それぞれを修正していく必要がなくなります。

 もう1つの利点として、このデータベースを利用することで、アイテムの種類ごとに用意していたゲームオブジェクトを1つだけ作ればよい手法が使えます。
複数のアイテムに対して複数のゲームオブジェクトを用意するのではなく、1つのゲームオブジェクトに対して
アイテムの情報を利用することで汎用的に利用していく、という形になります。

 何の情報も持っていないアイテム汎用プレファブがあるとします。このままでは、何の効果も発揮できませんが
情報として回復アイテムのデータが渡された場合には回復アイテムとしてふるまえるようにし、
攻撃力アップのデータが渡された場合には、攻撃力アップのアイテムとしてふるまうようにするというものです。

 それでは実際に作成していきましょう。

1.簡易データベースを作成する。


 まずは当サイトの記事を参考にして、簡易データベースを作成します。(以下、データベースとします。)
https://i-school.memo.wiki/d/%b4%ca%b0%d7%a5%c7%a1...

 設定する項目は自由に変更して頂いて構いません。ご自分のプロジェクトに合った内容でデータベースを作成しましょう。

2.データベースに、アイテムのデータを登録する。

 
 作成したデータベースに、アイテムのデータを順番に登録していきます。このデータを読み込んで、アイテムのクラスにデータを反映させます。
 
 アイテムのデータについて、各アイテムのプレファブで1つずつ入力するのではなく、
簡易データベースにアイテムのデータを登録しておき、その登録されている情報を元にアイテムのデータを自動的に設定するようにします。

 これにより、簡易データベースを修正することで、逐一プレファブのデータを変更する必要がなくなります。
また全アイテムのデータを登録しておけば、管理が非常に簡単にもなりまり、データを修正するための他のアイテムのデータとの比較も楽になります。

3.アイテムのデータを受け取るItemDetailクラスを作り、データベースの情報を反映したゲームオブジェクトを作成できるようにする。


 続いて、データベースのデータを受け取って、アイテムの役割(ふるまい)を決定するためのスクリプトを作成します。
こちらのスクリプトをゲームオブジェクトにアタッチすることにより、データの内容に合わせたアイテムとしてふるまいを変えさせます。
またこのスクリプトはItemBaseを継承しているアイテムクラスが一緒にアタッチされていることを前提にしています。

 Scriptsフォルダ内でメニューを表示し、 Create => C# Script を作成し、名前をItemDetailに変更しましょう。

ItemDetail.cs

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


 なお今回はスクリプトを分けましたが、ItemBaseに追記をして修正する形でも問題ありません。
 このInitItemというメソッドを利用してアイテムデータを受け取って、アイテムとしての役割を決定出来るようにしています。

4.ItemDetailクラスをアタッチする汎用アイテム・プレファブを作る。

使い方

 先ほども説明しましたように、今回はアイテムの種類に合わせて複数のプレファブを用意する手法ではなく
アイテム用のプレファブは1つだけにして、そのプレファブにアイテムデータを読み込ませることで、汎用的に利用することを目的にしています。

 そのため、生成された汎用アイテム・プレファブは何もアイテムとしての情報を持っていません。
生成される時にどのアイテムして生成されるかを設定して、役割が決まります。

 利点としては、アイテムの種類がたくさん増えても、その分のプレファブを追加で作成する必要がなくなります。
 またアイテムのデータを反映してアイテムを作成しますので、同じようにアイテムの数が増えてもスクリプトを変更せずに済みます。

汎用アイテム用プレファブを作成する


 汎用に使用できるアイテム用のゲームオブジェクトを作成します。

 ヒエラルキー上で Create => 3D Object => Cube を選択します。名前は ItemDetailPrefab にします。
オブジェクトの大きさとコライダーの大きさはプロジェクトに合わせて適宜変更してください。

 MeshRendererのMaterialの設定は初期値でもNoneで問題ありません。ここに、アイテムのデータに合わせてマテリアル(画像)を読み込ませていきます。
(今回は変化がわかりやすいようにNoneにしています)


 インスペクターは以下のようになります。追加でアタッチするコンポーネントはItemDetailスクリプトとItemBaseスクリプトです。



 アタッチしItemBaseをItemDetailにアサインします。ImageBaseの情報は設定する必要ありません。
ここにデータベースの情報が自動的に入るようにします。


 作成が終了したらプレファブにして、ヒエラルキー上からは削除します。

5.アイテムの生成方法を変更する。

 
 アイテムを生成しているスクリプトを修正します。今回のプロジェクトではEnemyControllerが該当します。

 まず1つ目に、宣言フィールドにあるアイテムプレファブ用の配列の宣言を削除し、代わりに作成した汎用アイテムプレファブを登録できるようにします。
宣言する方法は色々ありますが、今回はItemDetailで宣言しておきます。こうすることでインスタンスと同時にクラスが取得できるので
GetComponentをせずにInitItemメソッドを実行できます。

 つぎに、CreateDropItem()メソッド内を修正します。

 こちらではまず、ランダムに選択された番号(index変数の値)と、GameDataにアサインされているItemDataのリスト(ItemList)のアイテム番号とを照合し、
合致した番号のアイテムデータを1つ取得します。

そしてそのItemDataをItemDetailクラスのInitItemメソッドの引数として渡すことで、アイテムの情報を生成された汎用アイテムに情報として渡しています。

 EnemyControllerスクリプトを修正します。

EnemyController.cs

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


 修正されるとインスペクターのアサイン情報が更新され、配列のアサイン情報の登録がなくなる代わりに、ItemDetailPrefab変数が表示されます。
ここにProject内にプレファブ化しておいたItemDetailPrefabゲームオブジェクトをアサインします。

 ゲームを実行し、敵が落とす汎用アイテムのクローンが、ちゃんと回復アイテムや攻撃力アップのアイテムとして生成されていれば成功です。

参考動画です(ピンク色の汎用アイテムの画像が、ちゃんとブーツの画像になり、速度アップアイテムとして生成されていることが確認できます)
https://gyazo.com/de67fa182ae42ceb852b96d29b76a6fd