【问题标题】:How to use SetActive()如何使用 SetActive()
【发布时间】:2017-03-14 18:39:11
【问题描述】:

我正在尝试创建一个注册场景。当用户输入无效的姓名、电子邮件和/或密码时,我想显示三个面板。我在开始时隐藏了面板。这样可行。但是,当我输入无效信息并单击按钮时,面板不会显示。当validNamevalidEmailvalidPassword 为假时,它会进入 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);
}

Connecting variables in the Inspector

Panel hirearchy

【问题讨论】:

  • 您是否打算将您对 passwordPanel.SetActive (true) 的调用和其他 SetActive(true) 调用注释掉?
  • 卡住是什么意思,是不是崩溃了?
  • @JHH 是的,我正在测试以确保它进入其他 Show 方法。当我取消注释这些行时,它会卡在namePanel.SetActive (true); 中并且永远不会进入其他方法。
  • @CNuts 不,它不会崩溃。当 name、email 和 password 为 false 时,它​​应该出现在所有三个 Show 方法中。但是,它进入ShowNamePanel(),到达namePanel.SetActive (true);,然后就没有进展了。
  • 你可以试试移动你的namePanel.SetActive(true);在 if 中而不是在方法中使用它。

标签: c# unity3d unity2d


【解决方案1】:

好的,所以您的问题是,当游戏对象处于非活动状态时,该游戏对象的所有脚本也会停止工作。因此,如果您希望它起作用,最好将脚本放在其他将在此过程中保持活动状态的东西上。

在您设置Active(false) 面板的那一刻,它们上的脚本也处于非活动状态,因此它们将不再运行。

这是来自Unity Documentation

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

【讨论】:

  • 谢谢。所以我用HideNamePanel()HideEmailPanel()HidePasswordPanel() 方法创建了一个名为HidePanelCtrl 的脚本,并将它们附加到面板上。我使用ShowNamePanel()ShowEmailPanel()ShowPasswordPanel() 方法制作了第二个脚本ShowPanelCtrl,并将其连接到提交按钮。提交按钮也连接到第三个脚本:NewUser。我使用NewUser 调用前两个脚本来隐藏和显示面板。你是这个意思吗?隐藏面板有效,但显示面板仍然无效。 :(
  • 忽略我最后的评论。我使用 show 和 hide 方法制作了一个名为 HideShowPanelCtrl 的脚本。我把脚本放在提交按钮上。我还在提交按钮上放了一个 NewUser 脚本,并使用 NewUser 脚本来调用显示和隐藏中的方法。你是这个意思吗?我的面板上没有任何脚本了。隐藏有效,但显示仍然无效。
  • 在此期间您的按钮是否始终处于活动状态?
  • 是的,它处于活动状态。我有一个 Debug.Log 消息,每次单击按钮时都会打印到控制台。面板变为非活动状态后,按钮单击仍会注册。
  • 我在调用 ShowNamePanel() 时遇到 NullReferenceException。它表示对象引用未设置为对象 NewUser.CreateUser() 的实例。但是我在 start() 中使用了 showPanelCtrl 并且效果很好。
【解决方案2】:

您需要告诉 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)
}

【讨论】:

  • 我使用什么命名空间来让Panel 工作?输入 public Panel namePanel 时出现错误。我已经有了using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.SceneManagement;using System.Text.RegularExpressions;using System;using UnityEngine.UI;using UnityEngine.EventSystems;。另外 - 我在 Inspector 中将 namePanel、emailPanel 和 passwordPanel 连接到它们各自的面板。这与使用 GetComponent 有什么不同吗?
  • Sorry Panel 只是一个占位符类。这将是您要引用的组件的类 - 因此,如果它是 InputField,它将是 InputField,如果它是 Canvas,它将是 Canvas,如果它是自定义脚本,它将是该脚本的类,并且很快。如果您在检查员中分配了它们,它应该工作相同。只需确保它们所连接的 GameObject 在场景开始时处于活动状态。让 Awake 或 Start 方法禁用某些东西,否则 Unity 无法引用它们。
猜你喜欢
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 2014-08-14
  • 2023-03-25
相关资源
最近更新 更多