超今更ですが自分自身で使ったことが無かったので確認しました。
また、習得では無く修得かもしれませんが色々なサイト様から習っている感覚なので習得とします。
確認バージョン
unity2020.1.9f1(windows)
ScriptableObjectとは
シリアライズ可能なUnity独自のクラスです。
■シリアライズとは
メインメモリ上に展開しているオブジェクトを保存や送受信できるよう変換規則にしたがって文字列やbyte列に変換すること。
作り方
- ScriptableObjectクラスを継承したクラスを作成
- CreateAssetMenu属性を記述する。これにより右クリックでAsset下にScriptableObjectを生成できる(この手順を行わずコードから生成も可能)
[CreateAssetMenu] public class Item : ScriptableObject { public string Name => _name; public int Recover => _recover; public SerializableClass serializableClass= null; [SerializeField] string _name; [SerializeField] int _recover; } [Serializable] public class SerializableClass { public string Test = "テスト"; }
Assets上で右クリックからScriptableObjectを作成できる。
■CreateAssetMenu詳細
色々と設定できます。詳細はオフィシャルを参照。
シリアライズ化のルール
当然ながらあらゆるクラスをシリアライズ化することは不可能。
多分以下に準拠すれば大丈夫そう。基本的にはプリミティブ構成のシンプルな構造にすれば問題は発生しなそうです。
対象とメリット
■対象
使いやすいように使う形で問題無いと思いますが運用保守を考慮すると
- アイテム情報、敵情報といった共通で参照されるデータ
がScriptableObjectの主な対象になるかと思います。(マスターデータと言われるものですね)。
工夫してAssetBundleの属性付けとして利用している方もいました。素晴らしいです。
■メリット
- 外部データ化することでアプリ本体の更新をせずにデータ更新が可能になる
- ヒープの無駄使い防止。1度読み込めば後は使い回せる
- パフォーマンスが結構良い(参考サイト様参照)
といった所かなと思います。
デメリット
作業がUnityに依存することがデメリットに思えます。小規模なデータであれば編集しやすいですが膨大になるといちいちInspectorで設定するのが面倒になったり、そもそもエディタの画面構築に時間を要しそうです。(未検証)その場合はEXCELからImport等や別構造を考慮する必要があります。
ただEXCELはバイナリなのでバージョン管理で差分を取れないという側面も・・・。CSVという手もありますが・・・うーん。
パフォーマンス
以下の情報が参考になりました・・・!
実機とEditorで負荷が変わるようで中々判断が難しそうです。
発生したトラブル
社内の別プロジェクトでAssetbundle化したScriptableObjectを読み込む形で運用していたところ、ある日ぶっこ抜きツールで解析されてScriptableObjectの中身が読まれてしまう事態が発生。 データにはこれから先の情報(シナリオだったりガチャだったり)が含まれていたためネタバレ・・・!というトラブルがありました。 ScriptableObject(というかAssetBundle)は何もしないと簡単に中身を漁られるため注意が必要です。 このプロジェクトでは未来の重要情報は極力事前に含めない、そしてAssetBundleを独自暗号化することで対処しました。
参考サイト様
ekulabo.com qiita.com docs.unity3d.com www.urablog.xyz kan-kikuchi.hatenablog.com