最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
ngui 工具面板
本文主要介绍 NGUI 工具面板中的显示与隐藏功能,供大家学习交流。本文选自 StackOverflow(简称:SOF)精选问答汇总系列文章之一。
问题描述
提问者 Sona 刚开始学习 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 的哪个脚本里进行编辑以及如何编辑来解决这个问题。
答案解析
答案一(回答者:onevcat)
如果面板实际命名为 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);
}
答案二(回答者:Nicolas Dai)
GameObject.Find("Something") 函数无法找到任何处于禁用状态的游戏对象,因此不能采用这种方式。可以尝试在按钮代码中添加映射:
public GameObject panel1 = null;
public GameObject panel2 = 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() 方法中或者每次点击按钮时都使用它。