首页 > 解决方案 > Unity 自动隐藏面板

问题描述

我正在使用 Unity 构建一个 AR 应用程序。

它具有登录/注册场景,可让用户登录或注册应用程序。

对于错误处理和向用户显示错误消息(例如无效的电子邮件),我只是创建了一个面板,上面有一些文本来显示错误消息。此面板上还有一个按钮可以关闭消息并再次隐藏错误面板。

此面板覆盖在具有输入字段的主 UI 面板上。

显然,错误面板应该在加载场景时隐藏,只有在出现错误消息时才会显示。

但我无法在Awake()上设置此面板的状态。我不断收到错误NullReferenceException:对象引用未设置为对象的实例。

我已将脚本设置为错误面板,并将 Panel 对象添加到检查器中的脚本中。附上图片供参考。

以下是我的缩写代码(为简洁起见,使用省略)。我尝试在Start()Awake()中设置它,但都抛出相同的错误。如果我设置errorPanel.gameObject.SetActive( true ); Awake() - 没有错误被抛出。仅在设置为false时才抛出

public class RegisterScene : MonoBehaviour {
    public GameObject errorPanel; // Error panel

    void Awake()
    {
        errorPanel = GameObject.FindGameObjectWithTag("errorPanel"); // Error panel Tag
        Debug.Log("Error Panel: " + errorPanel); // Outputs "ErrorPanel" as named in Inspector
        errorPanel.gameObject.SetActive(false); // Have to hide on scene Awake - throws NullReferenceError here
        //errorPanel.gameObject.SetActive(true); // This works as a test case
    }

    // Register button clicked
    public void Register ()
    {
        // If error 
        showErrorPanel("You must complete all sections");
    }

    // Show error panel
    public void showErrorPanel(string errorMessage)
    {
        Debug.Log("Showing error panel");
        errorPanel.gameObject.SetActive(true); // Working - shows error panel

        // Confirmation button on error panel clicked
        hideErrorPanel();
    }

    // Hide error panel
    public void hideErrorPanel()
    {
        Debug.Log("Hiding error panel");
        errorPanel.gameObject.SetActive(false); // Working - hides error panel
    }
}

在此处输入图像描述

标签: c#unity3dnullreferenceexception

解决方案


如果我设置- 不会引发错误errorPanel.gameObject.SetActive(true);Awake()仅在设置为 false 时才抛出。

这可能是正在发生的事情:

您的RegisterScene脚本附加到另一个GameObject。GameObject.FindGameObjectWithTag("errorPanel")调用时,将返回您的面板。当您将其设置为falsewith 时errorPanel.gameObject.SetActive(false),它会停用它。

Awake然后将在它所附加的另一个GameObject 上调用该函数,该 GameObject 也将调用但这次GameObject.FindGameObjectWithTag("errorPanel")将返回。null它将返回null,因为GameObject.FindXXX函数找不到停用的对象。因为它是null,所以调用errorPanel.gameObject.SetActive将抛出该异常。

你有两个选择:

1 .从其他游戏对象中查找并删除脚本:

在此处输入图像描述

2FindInActiveObjectByTag .如果您需要查找未激活的游戏对象,请使用我的功能查找已停用的游戏对象。


推荐阅读