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

时间:2017-06-05 14:54:47

标签: c# unity3d nullreferenceexception

好的问题是,每当我想使用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)

所以看起来问题是在我创建随机值的方法中生成的,虽然我之前说这个以前工作得很好,这里是stat生成器的代码片段:

    //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;

        }
    }

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

有人问我是否已经为Text变量赋值,不是我没有,我所做的就是将它们初始化为:

public Text strengthText;
public Text dexterityText;

依此类推,我是否需要将它们变成某种东西以避免错误?

1 个答案:

答案 0 :(得分:1)

有时,在升级项目时,会丢失场景中的引用。在这种情况下,您似乎丢失了与Text变量相关联的textVar引用。只需从编辑器中重新拖动文本组件textVar插槽即可。

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

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

修改

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