UnityでScriptableObjectを使ってアイテムデータベースを作成する

今回はScriptableObjectを使ったアイテムデータベースを作成し、それを利用するようにしてみたいと思います。

アイテムを管理する機能は他の記事でも作成してきていますが、

Unityでキャラクターのアイテムを管理するプログラムを作る方法を考えます。
Unityのゲームで持ち物画面を作成し、アイテムの情報を見る事が出来るようにします

ゲーム中にアイテムデータベースにアイテム情報を登録する為、アイテムデータベースが作成される前にアイテム情報を取得しようとするとエラーが発生します。

アイテム情報はテキストファイル等に保存しておき、そこから取り出すという事も出来ますが、今回はScriptableObjectで作ったアセットファイルであらかじめアイテムのデータベースを作成しておくようにします。

こうすることでゲーム開始前からアイテムの情報を持ったアイテムデータベースファイルをスクリプトから読み出すだけで良くなるので便利です。

スポンサーリンク

ScriptableObjectとは

ScriptableObjectはゲームオブジェクトに取り付ける必要がないスクリプトに使用します。

↑のようにScriptableObjectクラスを継承して新しいクラスを作成します。

ScriptableObjectに関しては

UnityのScriptableObjectを使うと、メモリの節約が出来たり、シーン間の移動でデータを共有するのが簡単になります。この記事では基本だけを記述しています。

の記事に書いているのでそちらを参照してください。

アイテムデータベースの機能を作成する

それではScriptableObjectを使ったアイテムデータベースを作成していきましょう。

Itemクラスの作成

まずはアイテムデータベースに登録するアイテム個々の情報を保持するItemクラスを作成します。

ItemクラスはScriptableObjectを継承して作成します。

アトリビュートで[Serializable]を付け直列化可能にし、CreateAssetMenuでUnityメニューのAssetsでItemクラスのデータファイルを作成出来るようにしています。

Itemクラスではアイテムの種類、アイコン、名前、情報を保持し、それらの値を返すゲッターを用意しています。

これでItemクラスが出来ました。

UnityメニューのAssets→Create→CreateItemを選択すると今作成したItemクラスのデータファイルがAssetsフォルダに作成されます。

CreateItemを選択

デフォルトのファイル名はItemとなっているので個々のアイテムの英語名に変更してわかりやすくします。

Itemクラスのデータファイルが作成された

これが個々のアイテムのデータファイルとなるので、ファイルを選択してインスペクタで、アイテムの種類、アイコン、アイテム名、アイテム情報を記入します。

インスペクタで情報を記入する

地道に個々のアイテム情報を作成していきます。

これでItemクラスから作ったアイテムの個々のデータファイルが作成出来ました。

ItemDataBaseクラスの作成

個々のアイテムデータが出来たので、今度はその情報を一括で管理するデータファイルを作成します。

新しくItemDataBaseクラスを作成します。

ItemDataBaseクラスはScriptableObjectを継承して作成します。

CreateAssetMenuアトリビュートを取り付けUnityのAssetsメニューにCreateItemDataBase項目を追加します。

ItemDataBaseクラスではリストでItemを保持しておくようにし、そのリストを返すメソッドを持つだけです。

これでスクリプトが出来たのでItemDataBaseクラスからデータファイルを作成します。

UnityメニューのAssets→Create→CreateItemDataBaseを選択します。

ItemDataBaseクラスからデータファイルを作成

ItemDataBase.assetファイルがAssetsフォルダに作成されるので、選択してインスペクタで先ほど作成した個々のアイテムファイルを設定します。

Sizeに作成したアイテムの数と同じ数値を設定し、アイテムファイルを設定出来るようにします。

ItemDataBaseに個々のアイテムファイルを設定する

↑のようにItemDataBaseファイルに個々のアイテムファイルを設定していけばアイテムデータベースが出来上がります。

これでアイテムデータベースが完成しました。

アイテムデータベースを利用する

アイテムデータベースが完成したので、アイテムデータベースから情報を取り出してみようと思います。

ヒエラルキー上に空のゲームオブジェクトを作成し、名前をItemManagerとします。

ItemManagerゲームオブジェクトにはItemManagerスクリプトを作成し取り付けます。

ItemManagerクラスはゲームオブジェクトに取り付けて使用するスクリプトなのでMonoBehaviourクラスを継承して作成します(デフォルトでそうなっています)。

[SerializeField]アトリビュートを取り付けてItemDataBaseクラスのitemDataBaseフィールドを宣言します。

インスペクタで先ほど作成したItemDataBase.assetが設定出来るようになります。

個々のアイテムの数を管理する為にItemクラスをキーとしてその数を保持するDictionaryを宣言します。

StartメソッドでitemDataBaseのGetItemListsで全アイテムを取得し、個々のアイテム数を適当に設定しnumOfItemに設定します。

通常はゲーム中にアイテム数の変更があった時にnumOfItemの数を増やしたり減らしたりします。

アイテムデータベースの情報を表示し取得出来ていることを確認しています。

GetItemメソッドは引数としてアイテムの日本語名を渡し、アイテムデータベースからその名前と一致するItemクラスを返します。

見つからなかったらnullが返ってくるので、そういった対処も必要になります。

Startメソッドの最後でアイテムの日本語名を使ってGetItemでItemクラスを取得しその情報を表示したり、そのアイテムの数を表示したりしています。

これでItemManagerが完成しました。

ItemManagerコンポーネントのインスペクタでItemDataBase.assetデータファイルを設定しておけば後はそこから情報を取り出すだけなので簡単ですね。(^^)/

ItemManagerゲームオブジェクトのインスペクタは

ItemManagerコンポーネントのインスペクタ

↑のようにItemDataBase.assetをドラッグ&ドロップして設定します。

Unityを実行すると

アイテムデータベースから情報を取得したサンプルの結果

↑のようにアイテムデータベースから情報を取得出来ていることを確認出来ます。

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます