きっかけ
最近ScriptableObjectアーキテクチャパターンなるものがあることを知りました。そのアーキテクチャパターン自体は大したことではないのですが、「そもそもScriptableObjectってなんだっけ」となったので、調べたことをまとめてみます。結構Unityを使い慣れている人でも、ScriptableObjectが何か、具体的に説明するのは難しいのではないでしょうか。私は「マスターデータで使うやつ」くらいの認識しかありませんでした。
なお、この記事は下記の公式リファレンスを参考にしているので、より正確で詳細な情報が知りたい人はそっちを直接みてください。
概要
性質を列挙してみると
- コピーではなく参照を渡す
- プロジェクトのアセットとして保存する
- UnityEngine.Objectを継承している
- ゲームオブジェクトにアタッチできない
- エディターの編集中と実行時にデータを保存できる。名前空間がEditorだから。
- 揮発性があるのでセーブデータとしては活用できない
特に「コピーではなく参照を渡す」「プロジェクトのアセットとして保存する」が特徴的で、このおかげで大量のデータを保存するためのデータコンテナとして使用したり、シーンやクラスインスタンスの制限を受けずにアクセスしたりすることができるわけです。この性質を駆使したものがScriptableObjectアーキテクチャパターンになるわけですが、そちらはまた別記事にまとめる予定です
また、公式文書だとPrefab
と並んで説明されています。Prefab
はインスタンスの度にデータをコピーします。一方で、ScriptableObject
はメモリに1つのコピーしかないので、すべてのPrefab
から参照することでデータの重複が防げます。つまりメモリの節約ができるわけです。個人的にはPrefab
からScriptableObject
を参照する発想がなぜか無かったです。確かに使い勝手良さそう。
一言で説明してと言われたら
公式文書にある通り「大量のデータを保存するために使用できるデータコンテナ」で良さそうです。主目的としてマスターデータ(キャラクターのステータスとか)を保存する役割があるのは間違いなさそうです。ただそれに限らず、いろいろ便利な使い方があるってことです。ScriptableObjectの真の力を引き出せるエンジニアは少ないのかもしれません。
おまけ:Scriptableの意味
調べてみたのですがよく分からなかったです。「スクリプト化できる」と言われても、ピンと来ません。スクリプトと言えばUnityではソースコードを書くファイルが思い浮かびます。用語集にはきちんと説明があって、
A piece of code that allows you to create your own Components, trigger game events, modify Component properties over time and respond to user input in any way you like.
訳すと「独自のコンポーネントを作成、ゲームイベントの発動、時間の経過によるコンポーネントのプロパティの変更や入力への反応など、とにかく好きにできるコードのかけら」って意味かなと。多分。で、Scriptの意味はわかったのですが、それが Scriptable の意味はわかりません。アセットにクリエイトできるからScriptableなんですかね。誰か教えて偉い人。