ngui 面板的隐藏与显示

2015年01月19日 09:28 0 点赞 0 评论 更新于 2025-11-21 14:44

在探索相关知识时,我发现了一个关于 NGUI 面板隐藏与显示的问题,通过对该问题的分析,能让我们更好地了解 NGUI 面板的操作。

问题描述

一位初学者在学习 NGUI 和 Unity 时遇到了如下情况:在 UI Root 里有两个面板,分别命名为 firstPanelsecondPanel,其中 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 的哪个脚本里进行编辑以及如何编辑来解决此问题。

解决方案

检查面板命名

如果实际面板命名为 Panel1Panel2,那么使用 GameObject.Find("secondPanel")GameObject.Find("firstPanel") 是无法找到对应面板的。若 Panel1Panel2 是游戏场景中唯一的名称(即不存在其他重名的 Panel1Panel2),可以尝试以下代码:

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 panel1 = null;
public GameObject panel2 = null;

然后在场景编辑窗口中将 panel1panel2 分别设置到对应的面板。

提前查找活跃对象

另一种解决方案是,首先确保在场景中两个面板都是活跃状态,然后在按钮上添加如下脚本:

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);
}

性能优化建议

在 Unity3D 中,GameObject.Find(字符串名称) 函数的效率并不高,因此应避免在 Update() 函数中或者每次点击按钮时都使用该函数进行对象查找,以免影响性能。

作者信息

feifeila

feifeila

共发布了 3994 篇文章