我正在尝试制作关卡选择菜单。以下是我的布局的屏幕截图:为了实现这一目标,这是我实现这一目标的脚本:
using UnityEngine;
using UnityEngine.UI;
public class ChooseLevel : MonoBehaviour
{
string[] levelNames;
int i = 0;
public Button addIndex;
public Button subtractIndex;
public Text levelChooser;
string lvlName = "";
void Start()
{
levelNames = PlayMenu.levelNames;
addIndex.onClick.AddListener(delegate () { i += 1; });
subtractIndex.onClick.AddListener(delegate () { i -= 1; });
}
void Update()
{
i = Mathf.Clamp(i, 0, levelNames.Length);
lvlName = levelNames[i];
levelChooser.text = lvlName;
}
}
代码附加到画布上,这里是场景的屏幕截图和画布检查员的一部分:
我得到的错误是:
NullReferenceException: Object reference not set to an instance of an object
ChooseLevel.Update () (at Assets/ChooseLevel.cs:28)
答案 0 :(得分:2)
您将字符串声明在void Start()
之上,但不要初始化它。 (隐含地null
)
string lvlName;
因此,当您第一次进入Update()
时,lvlName
的值为null
。
void Update()
{
levelChooser.text = lvlName; //null the first time
lvlName = levelNames[i]; //THEN it's changed
Mathf.Clamp(i, 0, levelNames.Length);
}
因此,根据您的游戏逻辑,您必须首先分配给lvlName
或使用空字符串初始化它。我想
void Update()
{
i = Mathf.Clamp(i, 0, levelNames.Length); //FIRST clamp. Thanks to Joe Blow for pointing out that it never gets reassigned.
lvlName = levelNames[i]; //then update lvlName
levelChooser.text = lvlName; //then Change the text.
}
应该可以正常工作。还要确保i
没有达到确切的值levelNames.Length
,但我认为逻辑是可以的。当你遇到越界异常时,你会注意到。
答案 1 :(得分:0)
这只是另一个脚本中的一个小错误。