今回はScriptableObjectを使ったアイテムデータベースを作成し、それを利用するようにしてみたいと思います。
アイテムを管理する機能は他の記事でも作成してきていますが、
ゲーム中にアイテムデータベースにアイテム情報を登録する為、アイテムデータベースが作成される前にアイテム情報を取得しようとするとエラーが発生します。
アイテム情報はテキストファイル等に保存しておき、そこから取り出すという事も出来ますが、今回はScriptableObjectで作ったアセットファイルであらかじめアイテムのデータベースを作成しておくようにします。
こうすることでゲーム開始前からアイテムの情報を持ったアイテムデータベースファイルをスクリプトから読み出すだけで良くなるので便利です。
ScriptableObjectとは
ScriptableObjectはゲームオブジェクトに取り付ける必要がないスクリプトに使用します。
1 2 3 4 | public class TestClass : ScriptableObject { } |
↑のようにScriptableObjectクラスを継承して新しいクラスを作成します。
ScriptableObjectに関しては
の記事に書いているのでそちらを参照してください。
アイテムデータベースの機能を作成する
それではScriptableObjectを使ったアイテムデータベースを作成していきましょう。
Itemクラスの作成
まずはアイテムデータベースに登録するアイテム個々の情報を保持するItemクラスを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | using System.Collections; using System.Collections.Generic; using UnityEngine; using System; [Serializable] [CreateAssetMenu(fileName = "Item", menuName="CreateItem")] public class Item : ScriptableObject { public enum KindOfItem { Weapon, UseItem } // アイテムの種類 [SerializeField] private KindOfItem kindOfItem; // アイテムのアイコン [SerializeField] private Sprite icon; // アイテムの名前 [SerializeField] private string itemName; // アイテムの情報 [SerializeField] private string information; public KindOfItem GetKindOfItem() { return kindOfItem; } public Sprite GetIcon() { return icon; } public string GetItemName() { return itemName; } public string GetInformation() { return information; } } |
ItemクラスはScriptableObjectを継承して作成します。
アトリビュートで[Serializable]を付け直列化可能にし、CreateAssetMenuでUnityメニューのAssetsでItemクラスのデータファイルを作成出来るようにしています。
Itemクラスではアイテムの種類、アイコン、名前、情報を保持し、それらの値を返すゲッターを用意しています。
これでItemクラスが出来ました。
UnityメニューのAssets→Create→CreateItemを選択すると今作成したItemクラスのデータファイルがAssetsフォルダに作成されます。
デフォルトのファイル名はItemとなっているので個々のアイテムの英語名に変更してわかりやすくします。
これが個々のアイテムのデータファイルとなるので、ファイルを選択してインスペクタで、アイテムの種類、アイコン、アイテム名、アイテム情報を記入します。
地道に個々のアイテム情報を作成していきます。
これでItemクラスから作ったアイテムの個々のデータファイルが作成出来ました。
ItemDataBaseクラスの作成
個々のアイテムデータが出来たので、今度はその情報を一括で管理するデータファイルを作成します。
新しくItemDataBaseクラスを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(fileName = "ItemDataBase", menuName="CreateItemDataBase")] public class ItemDataBase : ScriptableObject { [SerializeField] private List<Item> itemLists = new List<Item>(); // アイテムリストを返す public List<Item> GetItemLists() { return itemLists; } } |
ItemDataBaseクラスはScriptableObjectを継承して作成します。
CreateAssetMenuアトリビュートを取り付けUnityのAssetsメニューにCreateItemDataBase項目を追加します。
ItemDataBaseクラスではリストでItemを保持しておくようにし、そのリストを返すメソッドを持つだけです。
これでスクリプトが出来たのでItemDataBaseクラスからデータファイルを作成します。
UnityメニューのAssets→Create→CreateItemDataBaseを選択します。
ItemDataBase.assetファイルがAssetsフォルダに作成されるので、選択してインスペクタで先ほど作成した個々のアイテムファイルを設定します。
Sizeに作成したアイテムの数と同じ数値を設定し、アイテムファイルを設定出来るようにします。
↑のようにItemDataBaseファイルに個々のアイテムファイルを設定していけばアイテムデータベースが出来上がります。
これでアイテムデータベースが完成しました。
アイテムデータベースを利用する
アイテムデータベースが完成したので、アイテムデータベースから情報を取り出してみようと思います。
ヒエラルキー上に空のゲームオブジェクトを作成し、名前をItemManagerとします。
ItemManagerゲームオブジェクトにはItemManagerスクリプトを作成し取り付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class ItemManager : MonoBehaviour { // アイテムデータベース [SerializeField] private ItemDataBase itemDataBase; // アイテム数管理 private Dictionary<Item, int> numOfItem = new Dictionary<Item, int>(); // Use this for initialization void Start () { for (int i = 0; i < itemDataBase.GetItemLists().Count; i++) { // アイテム数を適当に設定 numOfItem.Add (itemDataBase.GetItemLists() [i], i); // 確認の為データ出力 Debug.Log (itemDataBase.GetItemLists()[i].GetItemName() + ": " + itemDataBase.GetItemLists()[i].GetInformation()); } Debug.Log (GetItem ("ナイフ").GetInformation()); Debug.Log (numOfItem [GetItem ("ハーブ")]); } // 名前でアイテムを取得 public Item GetItem(string searchName) { return itemDataBase.GetItemLists().Find(itemName => itemName.GetItemName() == searchName); } } |
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ゲームオブジェクトのインスペクタは
↑のようにItemDataBase.assetをドラッグ&ドロップして設定します。
Unityを実行すると
↑のようにアイテムデータベースから情報を取得出来ていることを確認出来ます。