Toguchi-Design

ゲームをプレイしたり作ったりします。

【Unite 2017】ScriptableObjectについてメモ


【Unite 2017 Tokyo】ScriptableObjectを使ってプログラマーもアーティストも幸せになろう

この講演を見たので、メモします。

Scriptable Object

UnityEngine.Objectの派生クラス
UnityのシリアライズシステムではScriptableObjectを読み書きできる(メンバ変数)
Unityはこれから出てくる様々な参照を理解してトラッキングしてくれる
シンプルかつ単純なAPI

MonoBehaviourとの比較

MonoBehaviour

スクリプト
Unityからコールバックを受ける(OnCollisionEnterなど)
常にゲームオブジェクトにアタッチされる
AddComponentAPIを使う(動的)
Unityのシリアライズシステムとコンパチブル(保存できる)
シーン、プレハブに入る

Scriptable Object

スクリプト
Unityのシリアライズシステムとコンパチブル
Unityからのコールバックはほとんど受けない
Updateは呼び出されない(自動的には)
GameObjectへのアタッチはできない
常に独自の人生を歩む

ファイルについて

MonoBehaviour

セーブ→他のオブジェクトと一緒に保存される
MonoBehavior, GameObject, Transform
Prefabの一つのコンポーネントを変えるとファイル全体が変わる
↑シーンも

ScriptableObject

独自。バージョン管理には便利
コンフリクトを避けられる

MonoBehaviorで宣言

最大ライフをNPCで調整すると他の人が触れない
一つずつ個別にプログラムを書かないといけない
間違って誰かが変える可能性がある
コードでのコンテンツのチェックが必要

ScriptableObject

一つのオブジェクトにまとめる
MonoBehaviorで宣言していた変数をまとめる

メリット

値を別のところに切り分けられる
値のアップデートが直ぐにできる
シーン、プレハブのロードが早くなる

UnityではScene,Prefabの中のものや紐づけされているものを全てシリアライズしている
重複データのチェック、圧縮はない
それをロードするときにはそのプロパティ全てをロードする

全部を単一のScriptableObjectにつっこめばそれを一度だけシリアライズすることでまとめて参照される

作成する方法

動的

ScriptableObject.CreateInstance();

セーブする

AssetDatabase.CreateAsset();
AssetDatabase.AddObjectToFile();
[CreateAssetMenu]

コールバック

OnEnable
ScriptableObjectがロード、インスタンス化されたら呼ばれる
ScriptableObject.CreateInstance();
OnDestroy…Destroyされたあと
OnDisable…Destroyされるとき

ScriptableObject

Texture, AudioClipなどと同じ
他のアセットのと同じように存在する

アンロードされるとき

明示的にアンロードするとき
GCによって

UnityはC++のエンジン
C#スクリプトレイヤーが乗っている

ScriptableObjectの使い方

データコンテナとして使う

JSON, XMLのようなフォーマットよりもScriptableObjectのほうがはやい

列挙(Enum)として使う

普通比較に使う
同じScriptableObjectを参照しているかを調べる