今日はスクリプトの変数についてちょっと。
スクリプトにpublicな変数を宣言するとInspectorビューに表示されるんだって!
GUI上で編集できる!すごい!
ためしてみた
適当なスクリプトを作ってGameObjectに適用。
C#スクリプトを適用 |
スクリプトはこんな感じ。
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { public int X; }その状態でGameObjectのInspectorビューを見ると
変数が表示されてる |
知ったときはすごい衝撃でした。Unityすげー。
ここから興味本位で調べた内容。
ほとんどの人は興味ないと思うけど書いちゃう!
どこまで表示されるんだろう
ちょっと遊んでみた。using UnityEngine; using System.Collections; public class Test : MonoBehaviour { private int privateVariableInt; public int PublicVariableInt; public string PublicVariableString; public object PublicVariableObject; public int PublicPropertyInt { get; set; } public System.DayOfWeek PublicDayOfWeek; public event System.EventHandler PublicEvent; public System.Collections.Generic.List<int> PublicList; public MyClass MyClass; public MyClass2 MyClass2; public MyClass3<int> MyClass3; public UnityEngine.GameObject GameObject; public UnityEngine.Joint Joint; public UnityEngine.Color Color; public UnityEngine.Vector3 Vector3; } public class MyClass { public string Name; } public class MyClass2 : MonoBehaviour { public string Name; } public class MyClass3<T> : System.Collections.Generic.List<T> { }
結果
結構でた |
- Privateな変数はダメ。
- Publicな変数はOK。
- プロパティはダメ。
- 列挙型はOK。
- イベントはダメ。
- ListはOK。
- 自作クラスはMonoBehaviourを継承すればOK。
UnityEngine以下のクラスと基本型だけかと思ったらListとかも行けるのね。
でも自作クラスはMonoBehaviour継承しないとでないのか。
どーなってんだろ。よくわかんね。
Listが気持ち悪い
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { public System.Collections.Generic.List<string> MyList; }こんなスクリプトをかくと
Listの編集 |
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { public System.Collections.Generic.List<string> MyList; void Start() { MyList.ForEach(text => print(text)); } }こんな風に書けば
実行結果 |
これはすんごい!
でも…
いつ誰がインスタンス作ってんだろ?すごい気持ち悪いな。
初期化タイミング
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { public System.Collections.Generic.List<string> MyList = new System.Collections.Generic.List<string>() { "Unity" }; void Start() { MyList.ForEach(text => print(text)); } }こう書いても結果変わらないから、
クラスのInitialize後、Start()呼ばれる前にUnityがインスタンス上書きしてるんだなぁ。
Publicな参照型はUnityが勝手にインスタンスを作るのか???
GameObjectだと
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { public GameObject MyGameObject; void Start() { print(this.MyGameObject.name); } }これを動かしたときエラーする。
null参照エラー |
Listが特別扱いされてる?
やっぱりよくわかんない。
ま、そういうもんだと思っておこう。
いずれ調べてみるか。
→Unity系記事まとめ