Unity C# UI,Tab菜单系统。当我从0到1变化时,功能不被触发

问题描述 投票:0回答:1

我一直在研究这段代码,是为Unity中的一个UI的标签式系统而写的。我写了两个脚本。按钮控制器 父对象上的所有按钮选项,以及 按钮选择,这是一个在按钮Controller对象上所有按钮的代码。我把我写的代码放在下面。

到目前为止,它还算正常,但我遇到了一个有趣的错误。每当button Controller脚本中的buttonSelected值从0到1时,它不会触发标为1的按钮的功能。打开按钮 函数,直到我再次点击它。我还得到以下错误信息。

NullReferenceException: Object reference not set to an instance of an objectButtonSelection.TurnButtonOn () (at AssetsUI ElementsCodeButtonSelection.cs:29)ButtonController.ChangeButtonValue () (at AssetsUI ElementsCodeButtonController.cs:24)ButtonController.Start () (at AssetsUI ElementsCodeButtonController.cs:12)

我认为主要的问题在于this.transform.GetChild(0).gameObject.SetActive(true);,但是我已经尝试了很多次迭代(比如gameObject.transform.etc和其他一些东西),但似乎并没有改变它。这一点的另一个问题是,我不能做任何类似GameObject.Find的事情,因为这两个脚本是在多个对象上。有什么我遗漏的地方吗?谢谢:)

我不知道哪里可能出了问题,所以我把几乎所有的代码都包含了进去。作为一个快速的概述。按钮选择的 ActivateButton函数在 按钮控制器的 ChangeButtonValue,它要么激活 按钮选择的 TurnButtonOff或TurnButtonOn。对不起,是个麻烦 :(

public class ButtonController : MonoBehaviour

public void ChangeButtonValue()
{
    ButtonSelection[] buttonList = GetComponentsInChildren<ButtonSelection>();
    int i = 0;
    foreach (ButtonSelection bt in buttonList)
    {
        if (i != buttonSelected)
            bt.TurnButtonOff();
        else
            bt.TurnButtonOn();
        i++;
    }
}

public class ButtonSelection : MonoBehaviour
{
public int thisButtonsNumberID;
Image buttonImageOnOff;
public Sprite buttonOnImage;
public Sprite buttonOffImage;
public bool buttonOn =false;

void Start()
{
    //Fetch the Image from the GameObject
    buttonImageOnOff = GetComponent<Image>();
}

public void ActivateButton()
{
    this.transform.parent.GetComponent<ButtonController>().buttonSelected = thisButtonsNumberID;
    this.transform.parent.GetComponent<ButtonController>().ChangeButtonValue();
}

public void TurnButtonOn()
{
    buttonOn = true;
    buttonImageOnOff.sprite = buttonOnImage;
    this.transform.GetChild(0).gameObject.SetActive(true);
}
public void TurnButtonOff()
{
    buttonOn = false;
    buttonImageOnOff.sprite = buttonOffImage;
    this.transform.GetChild(0).gameObject.SetActive(false);
}

}

c# unity3d
1个回答
1
投票

我想出了一个解决方案,虽然还是被错误信息轰炸...在Controller脚本中,我把ChangeButtonValue函数改成了这个。

public void ChangeButtonValue(int buttonSelected)
    {
        if (transform.childCount > 0)
        {
            for (int i = 0; i < 5; i++)
            {
                gameObject.transform.GetChild(i).GetComponent<ButtonSelection>().CheckThisButton(buttonSelected);
            }
        }

    }

在选择代码中我加上了这个

public void CheckThisButton(int currentActiveButtonID)
    {
        if (currentActiveButtonID == thisButtonsNumberID) TurnButtonOn();
        else TurnButtonOff();

    }

这绝不是完美的,被错误信息轰炸着 NullReferenceException。对象引用未设置为对象的实例。UnityException: 变换子代出界 错误信息,但现在它有点工作。如果有人有任何建议,可以用更聪明的方法来解决这个问题,或者如果有人碰巧发现这个问题为什么会发生,请告诉我 :)我希望这能帮助其他有类似问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.