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のクラス名が出現しています。
クリックすると「New Achievement Data」というScriptableObjectが生成されます。
あとはInspector上から手動でデータを登録していきます。
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へドラッグ&ドロップします。
実行結果
他にもResourcesで呼び出す方法もあります。
ProjectビューにResourcesフォルダを作成し、そこにAchievementDataという名前のScriptableObjectを配置します。
完了したら以下のスクリプトを実行してください。
先ほどと同じ結果が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を作って使ってみるでした〜