2013年6月9日日曜日

【Unity】スクリプトの変数をInspecterビューで編集する

今日はスクリプトの変数についてちょっと。

スクリプトにpublicな変数を宣言するとInspectorビューに表示されるんだって!
GUI上で編集できる!すごい!

ためしてみた

適当なスクリプトを作ってGameObjectに適用。
C#スクリプトを適用
スクリプトはこんな感じ。
using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{
    public int X;
}
その状態でGameObjectのInspectorビューを見ると
変数が表示されてる
変数Xが表示されてる。しかもこのまま変更できる。
知ったときはすごい衝撃でした。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系記事まとめ

スポンサーリンク

Related Posts Plugin for WordPress, Blogger...