我将 Unity 从 5.3 升级到 5.6,现在出现空引用异常

I upgraded Unity from 5.3 to 5.6 and now I get null reference exceptions

好的,问题是每当我想使用 UI 文本时,我都需要将我的 int 值转换为字符串,所以我创建了一个方法,它只获取 Text 变量并赋予它值我拥有的 Int 变量,因此它可以被 UI 文本对象使用。

看起来像这样:

void setText(Text textVar, int valueVar)
{

    textVar.text = valueVar.ToString();

}

很简单吧?嗯..我收到错误:

NullReferenceException: Object reference not set to an instance of an object
UnityStandardAssets.Characters.FirstPerson.FirstPersonController.setText (UnityEngine.UI.Text textVar, Int32 valueVar) (at Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs:1617)
UnityStandardAssets.Characters.FirstPerson.FirstPersonController.generateRandomStat (Int32 stat) (at Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs:318)
UnityStandardAssets.Characters.FirstPerson.FirstPersonController.charCram () (at Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs:221)
UnityStandardAssets.Characters.FirstPerson.FirstPersonController.Start () (at Assets/Standard Assets/Characters/FirstPersonCharacter/Scripts/FirstPersonController.cs:1715)

所以问题似乎是在我创建随机值的方法中产生的,尽管就像我说的那样以前工作得很好,这里是统计生成器的代码片段:

    //method to generate a random stat from 3 to 18
    public void generateRandomStat(int stat)
    {
        int rng = Random.Range(3, 18);
        switch (stat)
        {
            case 0:
                strength = rng;
                setText(strengthText, strength);
                print(strength);
                break;
            case 1:
                dexterity = rng;
                setText(dexterityText, dexterity);
                print(dexterity);
                break;
            case 2:
                intelligence = rng;
                setText(intelligenceText, intelligence);
                print(intelligence);
                break;
            case 3:
                wisdom = rng;
                setText(wisdomText, wisdom);
                print(wisdom);
                break;
            case 4:
                constitution = rng;
                setText(constitutionText, constitution);
                print(constitution);
                break;
            case 5:
                charisma = rng;
                setText(charismaText, charisma);
                print(charisma);
                break;
            case 6:
                luck = rng;
                setText(luckText, luck);
                print(luck);
                break;
            case 7:
                willpower = rng;
                setText(willpowerText, willpower);
                print(willpower);
                break;

        }
    }

每个案例末尾的 print() 用于在使用 UI 元素之前首先在控制台中进行测试,每当我编译游戏时它甚至不会在控制台中打印统计数据。

有人问我是否给 Text 变量赋值,没有,我只是按如下方式初始化它们:

public Text strengthText;
public Text dexterityText;

诸如此类,我是否需要将它们设为 = 以避免出错?

有时在升级项目时,您会丢失场景中的引用。在这种情况下,看起来您丢失了连接到 textVar 变量的 Text 引用。只需将 Text 组件从编辑器中重新拖到 textVar 插槽中。

我通常从脚本中执行此操作,这样更新就不会导致任何这些问题:

textVar = GameObject.Find("YourTextObject").GetComponent<Text>();

编辑:

对于你编辑的问题,它仍然是同样的问题。从编辑器中重新分配所有文本变量,例如 strengthTextdexterityTextintelligenceTextwisdomText...它们在更新后丢失了引用。您也可以使用上面的代码在 Start 函数中执行此操作。