【问题标题】:panel hide and show in NGUINGUI 中的面板隐藏和显示
【发布时间】:2013-02-07 05:22:42
【问题描述】:

我是NGUIunity 3d 的新手。 我在ui 根目录中有两个面板。它被命名为firstPanelsecondPanel。 secondPanel 在场景中被停用。在firstPanel 我有很多按钮,其中一个是play 按钮,即图像按钮。当点击play 按钮时,firstPanel 应该得到 hidesecondPanel 应该 显示。我在 play 按钮上添加了一个新脚本并在其中编写了代码

void OnClick(){
    GameObject panel2  = GameObject.Find("secondPanel");
    NGUITools.SetActive(panel2,true);       
    GameObject panel1  = GameObject.Find("firstPanel");         
    NGUITools.SetActive(panel1,false);

}

但是我得到了这个错误"NullReferenceException" 我必须在ngui 的哪个脚本中进行编辑,我该怎么做?请帮我解决这个问题 提前致谢。

【问题讨论】:

  • 你在哪一行得到了异常?
  • 游戏对象 panel2 = GameObject.Find("secondPanel");这里我收到错误

标签: c# monodevelop unity3d ngui


【解决方案1】:

如果您的面板被命名为 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);

}

【讨论】:

  • 对不起。它不能正常工作。第二面板在场景中处于非活动状态。所以我不能展示它。
  • 所以我认为保留它们作为参考是可行的。试试这个:添加“public GameObject panel2;”在您的脚本中(在类主体中,例如在 void OnClick 上方)。然后选择您的播放按钮,您将在 Inspector 中的脚本上看到一个名为“Panel2”的字段。将第二个面板从游戏场景拖到字段中。然后你可以删除GameObject这一行,直接使用panel2。
  • 为什么要使用 GameObject.Find 和 NGUITools.SetActive?太慢了……难道没有办法不渲染吗?
【解决方案2】:

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(string name) 函数在 Unity3D 中效率不高,所以不要尝试在 Update() 中或每次单击按钮时使用它。

【讨论】:

    【解决方案3】:

    我知道这个线程很旧,但是如果其他人在不活动时调用面板时遇到问题,您可以预制您的面板并使用 NGUITools.AddChild 来调用您的面板。它看起来像这样。

    public GameObject parent;
    public GameObject child;
    
    void Spawn () {
    
    NGUITools.AddChild (parent, child);
    
    }
    

    将您的 UIRoot 分配给父级(或您想要添加面板的任何对象),然后在编辑器中将您的面板分配给子级,一切就绪!我希望这对某人有所帮助,这是第一次使用 NGUI 时的常见问题。

    快乐编码:)

    【讨论】:

      【解决方案4】:

      您不能使用 GameObject.Find() 来查找禁用的游戏对象,它返回 null;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-19
        • 2011-03-27
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-12
        相关资源
        最近更新 更多