在Start()上访问struct list会产生NullReferenceError

时间:2017-01-18 13:52:02

标签: unity3d

上帝的名义我在这里做错了什么?每次我运行游戏时都会得到这个:" NullReferenceException:对象引用未设置为对象的实例"。我知道这意味着我只是不明白为什么会这么说?

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;

public class Inventory : MonoBehaviour {

    public static Inventory instance;

    public List<InventoryItems> INVENTORY_ITEMS = new List<InventoryItems>();

    void Awake(){
        instance = this;
    }

    void Start(){
        Debug.Log(instance.INVENTORY_ITEMS); // ERROR
        Debug.Log(INVENTORY_ITEMS); // ERROR
    }
}

[Serializable]
public struct InventoryItems
{
    public string name;
}

1 个答案:

答案 0 :(得分:2)

这是你应该编写这段代码的方法:

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;

public class Inventory : MonoBehaviour {

    public static Inventory instance;

    public List<InventoryItems> INVENTORY_ITEMS;//do not initialize here

    void Awake(){
        instance = this;
        INVENTORY_ITEMS = new List<InventoryItems>();//init here instead
    }

    void Start(){
        Debug.Log(instance.INVENTORY_ITEMS); //no ERROR
        Debug.Log(INVENTORY_ITEMS); //no ERROR
    }
}

[Serializable]
public struct InventoryItems
{
    public string name;
}

补充说明:

出现此错误的原因是,正在从编辑器(检查员)读取monobehaviour中公共可序列化成员的值,覆盖在唤醒之前分配给它的任何值。

我建议将列表访问器更改为内部,或将其设置为属性,或将其保持公开,但让检查员处理初始化并添加初始元素。

添加了另一个注释:

根据Programmer和Uri Popov的说法,你的原始代码肯定会在5.4及更高版本的单位上运行。