今日はスクリプトの変数についてちょっと。
スクリプトに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系記事まとめ




