Unity:在检查员访问对象之前,如何确保对象被实例化?

时间:2017-01-06 05:40:17

标签: unity3d

这是我正在处理的事情。我有一个Tile班,一个TileController和一个TileControllerEditor

public class Tile
{
    public enum TileType {
        Blank, Portal
    }

    public TileType type;
}
public class TileController : MonoBehaviour
{
    // The View component of a Tile
    public GameObject tileObject;
    // The Model component of a Tile
    public Tile tile;

    public Tile.TileType tileType {
        get {
            return tile.type;
        }
        set {
            tile.type = value;
        }
    }

    void Awake()
    {
        tile = new Tile();
    }
}
[CustomEditor(typeof(TileController))]
public class TileControllerEditor : Editor
{
    TileController tc;
    public override void OnInspectorGUI()
    {
        tc = (TileController)target;
        DrawDefaultInspector();

        // Provide a dropdown for tileType
        tc.tileType = (Tile.TileType)EditorGUILayout.EnumPopup("Tile Type", tc.tile.type);
    }
}

我想将检查器中的tileType类的TileController属性作为下拉列表提供。我遇到的问题是,在我的自定义检查器中,首次访问tileType属性时,尚未调用Awake(),因此tilenull我得到一个NullReferenceException

在检查员访问我的类成员之前,如何确保我的类成员完全实例化?

2 个答案:

答案 0 :(得分:1)

您可以在声明时初始化Tile对象,完全避免Awake

public class TileController : MonoBehaviour
{
    public GameObject tileObject;
    public Tile tile = new Tile();

    public Tile.TileType tileType {
        get {
            return tile.type;
        }
        set {
            tile.type = value;
        }
    }
}

答案 1 :(得分:0)

我想出了一个适合我的解决方案。因为我在另一个编辑器脚本中创建了<script src="https://d3js.org/d3.v4.min.js"></script>,所以我能够简单地将TileController方法添加到Init()作为构造函数,我每次创建一个时都会手动调用。

TileController

然后当我创建public class TileController : MonoBehaviour { // The View component of a Tile public GameObject tileObject; // The Model component of a Tile public Tile tile; public Tile.TileType tileType { get { return tile.type; } set { tile.type = value; } } public void Init() { tile = new Tile(); } } 时(它们附加到预制件上,我实例化并调用TileController):

GetComponent<TileController>()