我将 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>();
编辑:
对于你编辑的问题,它仍然是同样的问题。从编辑器中重新分配所有文本变量,例如 strengthText
、dexterityText
、intelligenceText
、wisdomText
...它们在更新后丢失了引用。您也可以使用上面的代码在 Start 函数中执行此操作。
好的,问题是每当我想使用 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>();
编辑:
对于你编辑的问题,它仍然是同样的问题。从编辑器中重新分配所有文本变量,例如 strengthText
、dexterityText
、intelligenceText
、wisdomText
...它们在更新后丢失了引用。您也可以使用上面的代码在 Start 函数中执行此操作。