6

我是新手NGUIunity 3d。我在一个ui根中有两个面板。它被命名为firstPaneland secondPanel。secondPanel 在场景中被停用。我firstPanel有很多按钮,其中一个是play按钮,即图像按钮。单击play按钮时,应该firstPanel隐藏显示我向按钮添加了一个新脚本并在其中编写了代码secondPanelplay

void OnClick(){
    GameObject panel2  = GameObject.Find("secondPanel");
    NGUITools.SetActive(panel2,true);       
    GameObject panel1  = GameObject.Find("firstPanel");         
    NGUITools.SetActive(panel1,false);

}

但我得到这个错误:我必须"NullReferenceException" 在哪个脚本中ngui编辑,我该怎么做?请帮我解决这个问题提前谢谢。

4

4 回答 4

8

如果您的面板被命名为 Panel1 和 Panel2,您将无法使用 GameObject.Find("secondPanel") 和 GameObject.Find("firstPanel") 找到它们。如果“Panel1”和“Panel2”是游戏场景中唯一的名称(没有其他Panel1或Panel2),那么您可以尝试使用

void OnClick(){
  GameObject panel2  = GameObject.Find("Panel2");
  NGUITools.SetActive(panel2,true);       
  GameObject panel1  = GameObject.Find("Panel1");         
  NGUITools.SetActive(panel1,false);

}
于 2013-02-07T11:28:48.050 回答
3

GameObject.Find("Something") 找不到任何禁用的游戏对象,因此您不能通过这种方式使用。您可以尝试将反射添加到您的按钮代码:

public GameObject pannel1 = null;
public GameObject pannel2 = null;

并将它们设置为场景编辑器窗口中的右侧面板。

另一种方式,首先您需要在场景中保持两个面板都处于活动状态,然后将代码添加到按钮脚本中,如下所示:

private GameObject panel1 = null;
private GameObject panel2 = null;
void Start()
{
    panel1 = GameObject.Find("Panel1");
    panel2 = GameObject.Find("Panel2");
}

void OnClick()
{
    panel2.SetActiveRecursively(true);
    panel1.SetActiveRecursively(false);
}

GameObject.Find(string name) 函数在 Unity3D 中效率不高,因此不要尝试在 Update() 中或每次单击按钮时使用它。

于 2013-03-25T07:12:26.817 回答
1

我知道这个线程很旧,但如果其他人在不活动时调用面板时遇到问题,您可以预制您的面板并使用 NGUITools.AddChild 来调用您的面板。它看起来像这样。

public GameObject parent;
public GameObject child;

void Spawn () {

NGUITools.AddChild (parent, child);

}

将您的 UIRoot 分配给父级(或您想要添加面板的任何对象),然后在编辑器中将您的面板分配给子级,一切就绪!我希望这对某人有所帮助,这是第一次使用 NGUI 时的常见问题。

快乐编码:)

于 2014-09-28T12:13:55.347 回答
0

您不能使用 GameObject.Find() 来查找禁用的游戏对象,它返回 null;

于 2014-05-29T10:32:08.513 回答