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ではない状況。
なにかいい方法はないものか。。。