Menu
CoddyTech

面板的显示与隐藏

本课属于 Coddy Unity 学习旅程的“打造真正的游戏”单元。第 9 课,共 60 课。

面板是一种 UI Image,通常会铺满整个屏幕,按钮和文本都是它的子对象。对面板调用 SetActive(false) 会隐藏面板及其内部的所有内容,面板隐藏时无法点击其中的按钮。面板显示时,它的图像会接收原本要点击其下方内容的点击,因此无法按下全屏面板后面的按钮。这个地图可以通过角落里的按钮打开,也可以通过地图上的按钮关闭:

public GameObject mapPanel;
public Button mapButton;
public Button closeButton;

void Start()
{
    mapPanel.SetActive(false);
    mapButton.onClick.AddListener(() => mapPanel.SetActive(true));
    closeButton.onClick.AddListener(() => mapPanel.SetActive(false));
}

面板显示时更容易编辑,因此场景通常会在面板开启的状态下保存,然后由 Start() 将其隐藏。负责打开面板的脚本不要放在该面板上:未激活的 GameObject 不会调用 Start() 或 Update(),因此,如果面板保存时处于隐藏状态,挂在面板上的脚本就永远无法为按钮设置监听器。Canvas 或游戏管理器对象始终处于激活状态,适合放置这个脚本。mapPanel.activeSelf 可以告诉你面板是否已开启,因此 mapPanel.SetActive(!mapPanel.activeSelf) 可以切换面板的状态。

challenge icon

挑战

简单

给草地游戏添加一个菜单:在 Menu.cs 中编写 Start()。

  1. 使用 SetActive(false) 隐藏 menuPanel 和 helpPanel。
  2. menuButton 显示菜单,并设置 mover.enabled = false;resumeButton 隐藏菜单,并设置 mover.enabled = true。
  3. helpButton 隐藏菜单并显示帮助面板;backButton 则执行相反操作。

按“开始”并打开菜单:在点击 Resume 之前,玩家无法行走。然后点击“检查”。

亲手试试

using UnityEngine;
using UnityEngine.UI;

public class Menu : MonoBehaviour
{
    public GameObject menuPanel;
    public GameObject helpPanel;
    public Button menuButton;
    public Button resumeButton;
    public Button helpButton;
    public Button backButton;
    public PlayerMover mover;

    void Start()
    {
        // 隐藏两个面板,然后连接 Menu、Resume、Help 和 Back 按钮。
    }
}

打造真正的游戏中的所有课

自己练习: Unity 在线编辑器