Unityのスクリプトは基本的にMonoBehaviourを継承して作る。これは単純にUpdateやStartといった特定のタイミングで読んでくれるから制御が楽って理由だ。というか、Unityは基本的にアタッチしないと自動で読んでくれないので、どうしてもMonoBehaviourを継承する形になる。(処理/Modelの部分は別にMonoBehaviourを継承しなくてもいい。そのほうがテストが楽だし。Serializableでシリアライズ化すれば、inspectorから確認できるので問題ない)
さて、大分前の話になるが、CreateScriptDialogなるものがあった。これは、Unityで使うスクリプトを楽に作成する事のできるアセットなのだが、この中に「Scriptable object」なるものがある。
他のオブジェクトは兎も角、Scriptable objectとは一体何かうごごご・・・
[Unity3D]スクリプトをもっと楽に作る! CreateScriptDialog
http://tsubakit1.hateblo.jp/entry/20120527/1338129321ScriptableObject(Scripting Reference)
http://docs.unity3d.com/Documentation/ScriptReference/ScriptableObject.html
■GameObjectにアタッチしないコンポーネント
調べてみたところ、アタッチしないGameObjectとの事らしい。
インスタンスはnewではなくScriptableObject.CreateInstance
実際作ってみると、確かにアタッチはしない(というか出来ない)。しかしinspectorにはまるでGameObject待ちのような表示ができるので、ちょっと不思議な感じだ。
一応Find系の命令は持っているらしく、わざわざGameObject.とか書かなくてもStart時に自分で初期化することもできた。
スクリプトのpublicやserializeFieldで公開設定している内容の確認も可能らしい。ダブルクリックで中身が見れた。
また、HideFlagsなるものを設定すれば、inspectorから読み取り専用にしたり書き込み可能にしたり、色々と出来るらしい。
■イベントはEnable/DisableとDestroy
もう一つ、ScriptableObjectはMonoBehaviourみたいに、OnEnableやOnDisableを書いておくと特定のタイミングで呼び出してくれるらしい。例えばCreateInstanceでインスタンスを作成したときはOnEnableを呼ばれるし、Destroyで破棄するタイミングでOnDestroyが呼ばれる。
しかし不思議な事に、スクリプトを参照しているオブジェクトがない状態でもOnEnableが呼ばれたり(参照する方法は不明)、そもそもOnDisableを実行する方法が無かったりと不思議な事が多い。場合によってはアプリケーション起動時にOnDisable→OnEnableとか呼ばれたりする。不思議。
■用途が今ひとつ分からない
ここまで書いといてなんだが、今ひとつ使い方が良くわからない。
どうも本来の用途はデータ保管&スクリプトの差し替え的な使い方だと思うのだが、Inspectorからひと目で参照できないので使い勝手が悪いし、データ保管用にしても有るのか無いのか分かりにくいのでひどく使いにくい・・・が現状。
使い方がわかればイメージも変わると思うけど、うーん