我一直在研究这段代码,是为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);
}
}
我想出了一个解决方案,虽然还是被错误信息轰炸...在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: 变换子代出界 错误信息,但现在它有点工作。如果有人有任何建议,可以用更聪明的方法来解决这个问题,或者如果有人碰巧发现这个问题为什么会发生,请告诉我 :)我希望这能帮助其他有类似问题的人。