Roba Memo - 素人のUnity覚書と奮闘記

素人のUnity覚書と奮闘記

ScriptableObjectを使ってみた

ScripttableObjectとは

公式マニュアルによると・・・
Unity - マニュアル: ScriptableObject

大量のデータを格納できるクラス

だそうです。
ここでは、モンスターの出撃データの管理にこれを使ってみようと思う。

継承クラスを作る

using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu]
public class MobPopList:ScriptableObject
{
    public List<Param> route = new List<Param> ();

    [System.SerializableAttribute]
    public class Param
    {
        public string name;
        public float interval;
        public int quantity;
    }
}

[CreateAssetMenu]

これを書くと、こんな感じでCreateメニューに表示されるようになる。
f:id:nico-taniku:20171003172150p:plain:w300

[System.SerializableAttribute]

Createを実行すると、ScripttableObjectのアセットが生成される。
System.SerializableAttributeを書くと、インスペクターで設定できるようになる。
f:id:nico-taniku:20171003172522p:plain:w500

データを使う方法

リストの読み込み

MobPopList mobList = Resources.Load ("パス") as MobPopList;

パラメータの取得

//Element0のquantityを取得する場合
mobList.route [0].quantity;

メソッドを追加してみる

using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu]
public class MobPopList:ScriptableObject
{
    
    public List<Param> route = new List<Param> ();

    [System.SerializableAttribute]
    public class Param
    {
        public string name;
        public float interval;
        public int quantity;
    }

    //コレ追加 quantityの合計を取得するメソッド
    public int GetTotalQuanity ()
    {
        int total = 0;
        for (int i = 0; i < route.Count; i++) {
            total += route [i].quantity;
        }
        return total;
    }

}

メソッドの呼び出し方

MobPopList moblist = Resources.Load ("パス") as MobPopList;
int mob_total = moblist.GetTotalQuanity ();

注意点

Paramの要素を追加したりするのは大丈夫だけど、クラスなどの名前を変更すると初期化されて設定したのが消えちゃうので注意。

以上。