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,它工作正常。