Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity】ScriptableObjectを作って使ってみる

Unity 2019.2.0f1 Personal(2019年8月)
今回はScriptable Objectについて調査したいと思います〜
Scriptable Objectとは(静的)データを格納しておくアセットで、
マスターデータなどとして活用することができます!


参考

ScriptableObject - Unity マニュアル
kan-kikuchi.hatenablog.com
ScriptableObjectについて - テラシュールブログ

メリット
・データが重複して使用される場合、Scriptable Objectで共通化しておくとメモリ節約になる。
・アセットとしてまとまっているので差し替えが楽。
ゲーム内の異なるゾーンで異なるショップアイテムリストを使用する場合など
・ロード時間やメモリ使用量が軽減される。

Scriptable Objectの作り方

アチーブメント(達成報酬)を例にScriptable Objectを作成したいと思います!
「レベル5になったら2000円GET!」などのマスターデータです!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

[CreateAssetMenu]
public class AchievementData : ScriptableObject
{
    public List<Achievement> achievementList = new List<Achievement>();
}

[Serializable]
public class Achievement
{
    public int id;
    public int target;
    public int reward;
    public string info;
}

AchievementData.cs

・CreateAssetMenuアトリビュートを設定。
・クラスがScriptableObjectを継承している。
・SerializableしたクラスをListにまとめて複数データを管理

以上でScriptableObjectを作成する準備が整いました。
ProjectのCreateにScriptableObjectのクラス名が出現しています。
f:id:hiyotama:20190823084505p:plain
クリックすると「New Achievement Data」というScriptableObjectが生成されます。
f:id:hiyotama:20190823084636p:plain
あとはInspector上から手動でデータを登録していきます。
f:id:hiyotama:20190823084839p:plain

ScriptableObjectの使い方

ScriptableObjectの使い方は簡単で、Prefabなどと同様Inspectorへドラッグ&ドロップするだけです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AchievementController : MonoBehaviour
{
    public AchievementData achievementData;


    void Start()
    {
        foreach(var a in achievementData.achievementList)
        {
            Debug.Log("id:" + a.id +" 目標:"+ a.target +" 報酬:" +a.reward +" 情報:" + a.info);
        }
    }
}

AchievementController.cs

AchievementDataのScriptableObjectをメンバ変数とし、
先ほど作成したScriptableObjectをInspectorへドラッグ&ドロップします。
f:id:hiyotama:20190823125757p:plain
実行結果
f:id:hiyotama:20190823125824p:plain

他にもResourcesで呼び出す方法もあります。
ProjectビューにResourcesフォルダを作成し、そこにAchievementDataという名前のScriptableObjectを配置します。
f:id:hiyotama:20190823130233p:plain

完了したら以下のスクリプトを実行してください。
先ほどと同じ結果がConsoleビューに表示されます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AchievementController : MonoBehaviour
{
    private AchievementData achievementData;


    void Start()
    {
        achievementData = Resources.Load<AchievementData>("AchievementData");
        foreach(var a in achievementData.achievementList)
        {
            Debug.Log("id:" + a.id +" 目標:"+ a.target +" 報酬:" +a.reward +" 情報:" + a.info);
        }
    }
}

AchievementController.cs

以上、ScriptableObjectを作って使ってみるでした〜