江上宿六です。
前回ScriptableObjectを使ってデータを作ったり参照したりしました。
今回はそれを管理とか運用とかする為にもう一手間加えてみるというやつです。
この辺のデータを管理するにはListを使います、おなじみのリスト構造です。
自分の時代ではゲームにリストを使うのはあまり推奨されていませんでしたが
Unity、C#では割と簡単に扱えるようなので使っていきましょう。 そもそも
今回のケースなら動的に使うわけでもないので問題は起きにくいと思います。
それでは早速やっていきます。
スクリプトを追加してItemDataBaseと名付けたら前回と同様にCreateAssetMenuで
メニューを追加し、MonoBehaviourの所をScriptableObjectにします。
8,9行目がリストの宣言です。 リストはList<データ型>として宣言する事で
そのデータ型のリストを作る事が出来ます。 今回はItemDataで、前回作った
アイテムデータのリストを作るという感じです。
その後11行目からの関数はそのリストを取得出来るものとなっています。
それではメニューバーのAssetsからCreateItemDataBaseを選択しましょう。
こんな感じのものが出来ました。 [SerializeObject]のおかげでリストが
インスペクターから確認出来ますが現状Sizeが0の空のリストになっています。
Sizeを1に書き換えてみましょう。
ItemDataを差し込むソケットが出来ました。 ここに前回作ったデータを
アタッチすれば登録完了となります。 便利な操作方法としてインスペクター上の
要素を右クリックする事で要素を複製したり削除する事が出来るので活用しましょう。
要素を削除する際、オブジェクトがアタッチされている場合はそれが解除され
そうでない場合は要素数が減ります。 場所を空けたり詰めたりする場合なんかは
Sizeをいじったりするよりも簡単なはずです。
このItemDataBaseから値を参照する方法ですが、これは前回と殆ど同じです。
ItemDataBaseを[SerializeField]等で宣言して先ほど作ったItemDataBaseをアタッチ。
GetItemLists()でアイテムリストを取得し、その要素番号を指定して名前やら説明を
GetItemName()、GetItemInfo()で取得しています。
無事に参照する事が出来てます。
ただこうやってアイテムを取得するのに要素番号を使うのは直感的に分かりにくく
実際問題使いにくいので名前でアイテムを探して取得出来るようにします。
ItemData型を返すGetItem関数です。 itemDataBaseのGetItemLists()で
取得したリストの中からFindを使い、引数のsearchNameと同じ文字列を持つ
ItemDataを返すものです。
23行目でなんか独特の書き方がされていますが、こういう書き方をすることで
リスト化されたものの値だったり関数を参照する事が出来るようです。
GetItemを使って書き直したのがこちらです。 少し重そうな気はしますけど
これでだいぶ使いやすくなったはずです。 動作結果は先ほどと同じです。
こんな感じですね。 実際に扱うとなるとまた変わってくる所もあると思いますが
こういう風にアイテムを管理するのにScriptableObjectを使うのも一つの方法として
良いのではないでしょうか。
次回はこの辺のを使って実際にアイテムを生成してみるとか、もしくは
キャラ制御に戻ったりするのではないかと思います。