ScriptableObjectとは何でしょうか。
Unityのマニュアルには以下の記載があります。
- Saving and storing data during an Editor session
- Saving data as an Asset in your Project to use at run time
https://docs.unity3d.com/Manual/class-ScriptableObject.html
今回は2つ目のアセットとしてデータを保存しておいて実行時に利用する目的でコードを書いてみました。
ゲームのアイテムをアセットとして保存しておいてゲーム実行時に参照するようにしたいと思います。
そのための2つのステップは以下の通り。
- アセットファイル(.asset)を作成するコード
- アセットファイルの中身を参照して生成するコード
まずは、アセットファイルの作成方法から見ていきましょう。
アセットファイルの作成
ScritableObject
を継承したクラスを作ります。
using System.Collections.Generic; using UnityEngine; //.assetのファイル名を指定する [CreateAssetMenu(fileName = "ItemListData")] //ScriptableObjectを継承する public class ItemList : ScriptableObject { public List<Item> items; }
上記のコードをAssetsフォルダの中に保存します。
Assetメニューで選択するとアセットファイルが生成されます。


インスペクタからアイテムをセットします。
(インスペクタから設定できるようにItemクラスはSubscritableにしています。)

これでアイテムのアセット(データベース)が出来上がりました。
アセットファイルの中身を参照する
データベースができたので、データベースからアイテムを検索して引っ張ってくるコードを書いていきます。
public class Spawner : MonoBehaviour { public ItemList entity; static public Spawner instance; private void Awake() { if(instance == null) { instance = this; } } //アイテムの種類に応じて、アイテムを生成する public Item Spawn(Item.TYPE type) { //Listの中のアイテムを検索する foreach(Item item in entity.items) { if(item.type == type) { return new Item(item.type,item.sprite); } } return null; } }
シングルトンを使って何処からでも呼び出せるようしました。
空のオブジェクトを作成してスクリプトをアタッチします。

上で作ったアセットファイルをセットします。
これで呼び出したいタイミングでアイテムを生成すればOKです。
Item item = Spawner.instance.Spawn(type);
おわり。