这是我正在处理的事情。我有一个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()
,因此tile
为null
我得到一个NullReferenceException
。
在检查员访问我的类成员之前,如何确保我的类成员完全实例化?
答案 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>()