C# 如何使用SetActive()

C# 如何使用SetActive(),c#,unity3d,unity2d,C#,Unity3d,Unity2d,我正在尝试创建一个注册场景。当用户输入无效的名称、电子邮件和/或密码时,我想显示三个面板。我一开始就把面板藏起来了。这很有效。但是,当我输入无效信息并单击按钮时,面板不会显示。当validName、validMail和validPassword为false时,它进入ShowNamePanel()并卡住 我的代码怎么了 public GameObject namePanel; public GameObject emailPanel; public GameObject passwordPanel

我正在尝试创建一个注册场景。当用户输入无效的名称、电子邮件和/或密码时,我想显示三个面板。我一开始就把面板藏起来了。这很有效。但是,当我输入无效信息并单击按钮时,面板不会显示。当
validName
validMail
validPassword
为false时,它进入ShowNamePanel()并卡住

我的代码怎么了

public GameObject namePanel;
public GameObject emailPanel;
public GameObject passwordPanel;

public void Start ()
{
    HideNamePanel ();
    HideEmailPanel ();
    HidePasswordPanel ();
}

public void ButtonClick ()
{
    Debug.Log ("1. Button clicked.");

    CreateUser ();
}

/*
 * Sends post request to create new user if name, email, and 
 * password are valid.
 */

public void CreateUser ()
{

    validName = IsValidName (username);
    validEmail = IsValidEmailAddress (email);
    validPW = IsValidPassword (password);
    //validNewUserCombo = IsValidNewUserCombo (email, password);

    if (validName && validEmail && validPW) {
        Debug.Log ("6. VALID INPUTS");
        CallAPI ();
    } else {
        Debug.Log ("8. INVALID INPUTS");
        if (validName == false) {
            ShowNamePanel ();
        }
        if (validEmail == false) {
            ShowEmailPanel ();
        }
        if (validPW == false) {
            ShowPasswordPanel ();
        }
    }
}

public void ShowNamePanel() {
    Debug.Log ("shownamepanel");
    namePanel.SetActive (true);
}

public void HideNamePanel() {
    namePanel.SetActive (false);
}

public void ShowEmailPanel() {
    Debug.Log ("showemailpanel");
    emailPanel.SetActive (true);
}

public void HideEmailPanel() {
    emailPanel.SetActive (false);
}

public void ShowPasswordPanel() {
    Debug.Log ("showpasswordpanel");
    passwordPanel.SetActive (true);
}

public void HidePasswordPanel() {
    passwordPanel.SetActive (false);
}


您需要告诉Unity您正试图禁用/启用哪些面板,如下所示:

public Panel panelToToggle;
private void Awake()
{
     // Gets the Panel component if there's one on the GameObject this
     // script is attached to
     panelToToggle = GetComponent<Panel>();
}
private void Start()
{
     // Sets the parent gameObject of the Panel component to inactive
     panelToToggle.gameObject.SetActive(false)
}
private void EnablePanel()
{
     // Sets the parent gameObject of the Panel component to active
     panelToToggle.gameObject.SetActive(true)
}
public Panel-toggle;
私人空间
{
//获取面板组件(如果此游戏对象上有)
//脚本已附加到
PanelToToToggle=GetComponent();
}
私有void Start()
{
//将面板组件的父游戏对象设置为非活动
PanelToToToggle.gameObject.SetActive(false)
}
私有void启用面板()
{
//将面板组件的父游戏对象设置为活动
PanelToToToggle.gameObject.SetActive(真)
}

好的,问题是当游戏对象处于非活动状态时,该游戏对象的所有脚本也停止工作。因此,如果你想让它起作用,你最好把脚本放到另一个在这个过程中保持活跃的东西上

在您的情况下,当您将面板设置为active(false)时,面板上的脚本也处于非活动状态,因此它们将不再运行

这是来自:

使游戏对象处于非活动状态将禁用每个组件,关闭任何附加的渲染器、碰撞器、刚体、脚本等


您是否打算让您对passwordPanel.SetActive(true)和其他SetActive(true)调用的调用被注释掉?您说它卡住是什么意思,它会崩溃吗?@JHH是的,我正在测试以确保它进入其他Show方法。当我取消注释这些行时,它会卡在
namePanel.SetActive(true)中并且永远不会进入其他方法。@CNuts不,它不会崩溃。当名称、电子邮件和密码为false时,应该在所有三种Show方法中使用。但是,它进入
ShowNamePanel()
,进入
namePanel.SetActive(true)之后就不会继续了。你能试着移动你的namePanel.SetActive(true)吗;在if中,而不是在方法中使用它。我应该使用什么名称空间使
面板
工作?键入
公共面板名称面板时出错。我有
使用System.Collections
使用System.Collections.Generic
使用UnityEngine
使用UnityEngine.SceneManagement
使用System.Text.RegularExpressions
使用系统
使用UnityEngine.UI,以及使用UnityEngine.EventSystems的
已经存在。此外,我已经将namePanel、emailPanel和passwordPanel连接到Inspector中各自的面板。这与使用GetComponent不同吗?抱歉,Panel只是一个占位符类。这将是您想要引用的组件的类的任何内容-因此,如果它是InputField,它将是InputField,如果它是Canvas,它将是Canvas,如果它是自定义脚本,它将是该脚本的类,等等。如果您在inspector中指定了它们,则其工作方式应相同。只需确保他们所连接的游戏对象在场景开始时处于活动状态。让唤醒或启动方法禁用东西,否则Unity无法引用它们。谢谢。因此,我创建了一个名为
HidePanelCtrl
的脚本,使用方法
HideNamePanel()
HideEmailPanel()
HidePasswordPanel()
将它们附加到面板上。我使用方法
ShowNamePanel()
ShowEmailPanel()
ShowPasswordPanel()
制作了第二个名为
ShowPanelCtrl
的脚本,并将其连接到提交按钮。提交按钮还连接到第三个脚本:
NewUser
。我使用
NewUser
调用前两个脚本来隐藏和显示面板。这就是你的意思吗?隐藏面板起作用,但显示面板仍不起作用:(忽略我的上一条评论。我使用show和hide方法创建了一个名为HideShowPanelCtrl的脚本。我将该脚本放在submit按钮上。我还将一个NewUser脚本放在submit按钮上,并使用NewUser脚本调用show和hide中的方法。这是你的意思吗?面板上不再有任何脚本。hide可以工作,但show仍然是d。)oesn不工作。在所有这些过程中,您的按钮始终处于活动状态吗?是的,它处于活动状态。我有一条调试日志消息,每次单击按钮时都会打印到控制台。在面板变为非活动状态后,按钮单击仍会注册。我收到一个NullReferenceException,我将其称为ShowNamePanel()。它表示对象引用未设置为对象NewUser.CreateUser()的实例。但我在start()中使用了showPanelCtrl,它工作正常。