ngui 工具面板

2015年01月21日 10:06 0 点赞 0 评论 更新于 2025-11-21 14:58

本文主要介绍 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() 方法中或者每次点击按钮时都使用它。