【Unity】ScriptableObjectの使い方

unity

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つのステップは以下の通り。

  1. アセットファイル(.asset)を作成するコード
  2. アセットファイルの中身を参照して生成するコード

まずは、アセットファイルの作成方法から見ていきましょう。

アセットファイルの作成

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);

おわり。

参考

https://docs.unity3d.com/Manual/class-ScriptableObject.html