这里主要介绍的是ngui 工具面板里面的显示和隐藏,供大家来学习交流。

本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章
问题:
Sona
我刚开始学NGUI和Unity。在UI root里有两个面板,分别叫做firstPanel和secondPanel。secondPanel在场景里是隐藏的。firstPanel里有许多按钮,其中一个是play按钮,是个图像按钮。当我点击play按钮的时候,firstPanel应该隐藏,secondPanel应该显示。我给play按钮添加了一个新脚本,并在里面写了代码:

  1. void OnClick(){
  2.     GameObject panel2  = GameObject.Find("secondPanel");
  3.     NGUITools.SetActive(panel2,true);       
  4.     GameObject panel1  = GameObject.Find("firstPanel");         
  5.     NGUITools.SetActive(panel1,false);
  6.  
  7. }
但是我遇到了这个错误:"NullReferenceException"。我需要在NGUI的哪个脚本里编辑,怎么编辑呢?请帮助我解决这个问题,先谢谢了。
答案:
onevcat
如果你的面板命名的是 Panel1 和Panel2, 你将不能通过GameObject.Find("secondPanel") 和 GameObject.Find("firstPanel")找到它们。如果"Panel1" 和"Panel2"是游戏场景里唯一的名称(没有其他的Panel1 或者Panel2),那么你可以尝试:

  1. void OnClick(){
  2.   GameObject panel2  = GameObject.Find("Panel2");
  3.   NGUITools.SetActive(panel2,true);       
  4.   GameObject panel1  = GameObject.Find("Panel1");         
  5.   NGUITools.SetActive(panel1,false);
  6.  
  7. }
Nicolas Dai
GameObject.Find("Something") 不能找到任何禁用的游戏对象,所以你不能用这种方式使用。你可以试试在按钮代码添加映射:
1
2
public GameObject pannel1 = null;
public GameObject pannel2 = null;
并在场景编辑窗口中将它们设置到相应的面板。
另一种方法,首先在场景中保证两个面板都是活跃的,然后在按钮添加这样的脚本:

  1. private GameObject panel1 = null;
  2. private GameObject panel2 = null;
  3. void Start()
  4. {
  5.     panel1 = GameObject.Find("Panel1");
  6.     panel2 = GameObject.Find("Panel2");
  7. }
  8.  
  9. void OnClick()
  10. {
  11.     panel2.SetActiveRecursively(true);
  12.     panel1.SetActiveRecursively(false);
  13. }
GameObject.Find(字符串名称) 函数在Unity3D中并不是很有效,所以不要试着在Update(),或者每次点击按钮时用它。