本日はScriptable Objectを簡単にですが紹介します。
Scriptable Object とは。
Scriptable Objectは、共有データを管理するのに適したアセットファイルです。
スクリプタブルオブジェクトというネーミングから、スクリプトから操作可能なオブジェクト??よく分からんとなりますが、各所で共通で使用する値をオブジェクトとしてまとめたものぐらいの認識でよいかと思います。もっと簡単に言うと、Unity版マスタデータ管理ファイルです。
Scriptable Object のメリット
Scriptable Object は、Flyweightデザインパターンの適用です。各クラスのインスタンスが保持しているデータのうち、変更されず共有できる値を抜き出して Scriptable Object としてまとめ、その唯一のインスタンスを参照させることでメモリを節約できることが1つ目の利点です。ただし、Scriptable Object じゃなくても、静的変数なり独自にデータコンテナクラスを作ってもメモリの節約という目的だけならば達成できそうです。
もう1つ、Scriptable Object 独自の利点があります。Unityエディタでプレイモード中に行われた値の変更を保存することができます。Unityを使用した方であれば、一度はやらかしたであろう「カメラを適切に配置してプレイモードを終えたら、元の位置に戻ってしまった」現象を回避することができます。そのため、実際に動かしながら微調整を行う必要があるパラメーターなどは、 Scriptable Object を使用することで開発が捗るかもしれません。ちなみに、値の変更を保存する機能はUnityエディタ上で行われる操作の場合です。デプロイ後のアプリケーションなど本番環境では、値の保存は行われません。なので、永続ストレージとしてScriptable Objectを運用することはできません。
Scriptable Object の作成
Scriptable Objectの作成は簡単です。簡単な例として、最大HPだけを値として持つEnemyStatus を作ります。
1 2 3 4 5 6 7 |
using UnityEngine; [CreateAssetMenu(fileName = "EnemyStatusData", menuName = "ScriptableObjects/EnemyStatusScriptableObject", order = 1)] public class EnemyStatus : ScriptableObject { public int MaxHitPoint; } |
難しい事はとくになく、ScriptableObjectを継承して、メンバ変数を定義します。MonoBehaviourを継承しないため、ゲームオブジェクトにアタッチすることはできません。では、どのようにゲーム内で使うのかといいますと、今作成したクラスを雛形にアセットファイルを作成し、アセットファイルをスクリプトに割り当てたり、ロードするなどして使用します。
CreateAssetMenuアトリビュートにより、Unityエディタ上で ScriptableObject のアセットファイルが作成できます。
作成したアセットファイルをスクリプトコンポーネントに渡してあげれば、スクリプトから利用可能になります。
プレイモードで適当に値をいじって、プレイモードを終了してみましょう。値が保持されたままになっていると思います。