这是我在找东西的时候发现的一个关于ngui 面板的隐藏与显示的问题,通过这个可以让我们更好的了解ngui面板。
 问:
       我刚开始学NGUI和Unity。在UI root里有两个面板,分别叫做firstPanel和secondPanel。secondPanel在场景里是隐藏的。firstPanel里有许多按钮,其中一个是play按钮,是个图像按钮。当我点击play按钮的时候,firstPanel应该隐藏,secondPanel应该显示。我给play按钮添加了一个新脚本,并在里面写了代码:
void OnClick(){
GameObject panel2  = GameObject.Find("secondPanel");
NGUITools.SetActive(panel2,true);
GameObject panel1  = GameObject.Find("firstPanel");
NGUITools.SetActive(panel1,false);
}
       但是我遇到了这个错误:"NullReferenceException"。我需要在NGUI的哪个脚本里编辑,怎么编辑呢?请帮助我解决这个问题,先谢谢了。
 答案:
       如果你的面板命名的是 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);
}

       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(字符串名称) 函数在Unity3D中并不是很有效,所以不要试着在Update(),或者每次点击按钮时用它。