我是NGUI
和unity 3d
的新手。
我在ui
根目录中有两个面板。它的名称为firstPanel
和secondPanel
。 secondPanel在场景中停用。在firstPanel
我有很多按钮,一个是play
按钮,即图像按钮。在点击play
按钮时,firstPanel
应隐藏,secondPanel
应显示。我会向{{1添加新脚本按钮和编写的代码
play
但我得到错误:void OnClick(){
GameObject panel2 = GameObject.Find("secondPanel");
NGUITools.SetActive(panel2,true);
GameObject panel1 = GameObject.Find("firstPanel");
NGUITools.SetActive(panel1,false);
}
"NullReferenceException"
我必须编辑哪个脚本,我该怎么做?请帮我解决这个问题
提前谢谢。
答案 0 :(得分:8)
如果你的面板被命名为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);
}
答案 1 :(得分:3)
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()或每次单击按钮时使用它。
答案 2 :(得分:1)
我知道这个帖子已经过时了但是如果其他人在调用面板时遇到问题,你可以预制你的面板并使用NGUITools.AddChild来调用你的面板。它看起来像这样。
public GameObject parent;
public GameObject child;
void Spawn () {
NGUITools.AddChild (parent, child);
}
将您的UIRoot分配给父级(或者您想要添加面板的任何内容),并在编辑器中将您的面板分配给子级,然后全部设置!我希望这可以帮助某人,这是第一次使用NGUI时的常见问题。
快乐编码:)
答案 3 :(得分:0)
你不能使用GameObject.Find()来找到一个禁用的游戏对象,它会返回null;