Inspectorにconstな変数を表示したい。
class Global : MonoBehaviour{ const float fVariables = 1.0f; }
のような定数をInspectorで調整したい。でも、プログラムからは変更できないようにしたい。
みたいな状況が起こったのでどうしようかいろいろ考えた。
そもそもInspector上でconstな変数やstaticな変数は表示できない。プロパティの編集もできない。
publicやprivateな変数しか現状はInspector上でいじれない、ということである。
余談ではあるが、プロパティをInspector上で編集させてくれ、という要望も却下されてしまったようである。
staticなパラメータをInspector上で編集できるようにするにはSingletonにすればよいらしい。
しかし、何も考えずにC++的なSingletonを実装したところ、MonoBehaviourはnewが禁止されていることが発覚。結構ここではまる人は多いようである。
で、調べたところ
http://naichilab.blogspot.jp/2013/11/unitymanager.html
のように実装すればいけることがわかった。
試したところ、無事うまくいった。
まとめ
public class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour { private static T instance; public static T Instance { get { if (instance == null) { instance = (T)FindObjectOfType(typeof(T)); if (instance == null) { Debug.LogError(typeof(T) + "is nothing"); } } return instance; } } } class Global : SingletonMonoBehaviour<Global> { public float VARIABLES = 0.0f; }
してHierarchy上に空のGameObjectを配置、Globalをコンポーネントとして追加すれば、VARIABLESがインスペクターに表示されるはずである。
スクリプトから呼ぶときは
float variable = Global.Singleton.VARIABLES;
となる。
とはいえ、結局Instance経由で変数の変更はできてしまうので、staticではあってもconstではない状況。
なにかいい方法はないものか。。。