Unity c# - 应更改文本的脚本出错

时间:2016-04-12 16:11:19

标签: c# unity3d

我正在尝试制作关卡选择菜单。以下是我的布局的屏幕截图:enter image description here为了实现这一目标,这是我实现这一目标的脚本:

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

}

代码附加到画布上,这里是场景的屏幕截图和画布检查员的一部分:
enter image description here
enter image description here

我得到的错误是:

NullReferenceException: Object reference not set to an instance of an object
ChooseLevel.Update () (at Assets/ChooseLevel.cs:28)

2 个答案:

答案 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)

这只是另一个脚本中的一个小错误。