当到达数组结束时禁用按钮

本文关键字:按钮 结束 数组 | 更新日期: 2023-09-27 18:04:36

如何正确禁用GameObject中的按钮?到目前为止,我的代码返回错误:

NullReferenceException:对象引用未设置为LoadGallery对象。nextImage () .

这个错误来自以下行:

Button btn = nextBtn.GetComponent<Button>();

我不明白为什么引用无效。此外,是否存在将if-else语句中的重复代码合并到单个位置的最佳实践?

// Increment through gallery
if(currentIndexArray < galleryImages.Length)
{
    StartCoroutine("loader", currentIndexArray++);
}
// Disable Next Button when the end is reached
if(currentIndexArray == galleryImages.Length)
{
    GameObject nextBtn = GameObject.FindGameObjectWithTag("NextBtn");
    Button btn = nextBtn.GetComponent<Button>();
    btn.enabled = false;
    btn.interactable = false;
}
else
{
    GameObject nextBtn = GameObject.FindGameObjectWithTag("NextBtn");
    Button btn = nextBtn.GetComponent<Button>();
    btn.enabled = true;
    btn.interactable = true;
}

当到达数组结束时禁用按钮

数组索引为零索引,因此您必须更改

if(currentIndexArray < galleryImages.Length)

if(currentIndexArray < galleryImages.Length - 1)

if (currentIndexArray == galleryImages.Length)

if (currentIndexArray == galleryImages.Length - 1)

确保nextBtn gameObject在使用GetComponent<Button>()方法之前不为空。

试着像这样添加一个null检查:

GameObject nextBtn = GameObject.FindGameObjectWithTag("NextBtn");
if(nextBtn != null)
{
    Button btn = nextBtn.GetComponent<Button>();
    btn.enabled = true;
    btn.interactable = true;
}

我让它的工作,使按钮gameObjects公共:

public GameObject nextBtn;
public GameObject prevBtn;

然后我将游戏对象放入Unity检查器窗口的脚本部分的各自字段中。之后,我删除了FindObjectByTag行在我的函数和其他一切工作。

public void nextImage()
{
    // Increment through gallery
    if(currentIndexArray < galleryImages.Length)
    {
        StartCoroutine("loader", currentIndexArray++);
        Debug.Log(currentIndexArray);
    }
    // Disable Next Button when the end is reached
    if(currentIndexArray == galleryImages.Length)
    {
        Button btn = nextBtn.GetComponent<Button>();
        btn.enabled = false;
        btn.interactable = false;
    } else {
        Button btn = nextBtn.GetComponent<Button>();
        btn.enabled = true;
        btn.interactable = true;
    }
}
public void prevImage()
{
    // Decrement through gallery
    if(currentIndexArray > 0)
    {
        StartCoroutine("loader", currentIndexArray--);
        Debug.Log(currentIndexArray);
    }
    // Disable Prev Button when the end is reached
    if(currentIndexArray == 0)
    {
        Button btn = nextBtn.GetComponent<Button>();
        btn.enabled = false;
        btn.interactable = false;
    } else {
        Button btn = nextBtn.GetComponent<Button>();
        btn.enabled = true;
        btn.interactable = true;
    }
}