1、目標
創建菜單頁面,可通過Esc鍵開啟或關閉。
當把鼠標懸停在上面時它會高亮,然后當點擊按鈕時標簽頁會被選擇。
2、 創建PauseMenuCanvas
(1)創建Canvas
在Hierarchy -> PersistentScene -> UI下創建新的Cavans命名為PauseMenuCanvas(右擊 -> UI -> Canvas)。
配置組件的參數如下:
(2)創建BlackBackground
接下來創建黑色背景:
在PauseMenuCanvas下創建Image對象,重命名為BlackBackground:
Anchor Presets設置為:按住Shift + Alt,選擇如下:
其他設置如下:
(3)創建PauseMenuPanel
接下來創建菜單的面板。
在PauseMenuCanvas下創建Image命名為PauseMenuPanel,其組件設置如下:
其中Anchor Presents還是Shift + Alt選擇stretch + stretch。
(4)創建功能標簽對象
接下來創建功能標簽對象,這些對象當我們在不同類型之間切換時它們會被激活,我們會創建7種功能標簽。
在PauseMenuPanel下創建新物體命名為Tab0InventoryManagement,僅設置Anchor Presents為Shift + Alt的Stretch + stretch。
復制Tab0InventoryManagement,分別創建Tab1 ~ Tab6。
然后再設置Tab1 ~ Tab6為非激活狀態。
(5)創建SelectionTabImagesPanel
接下來創建標簽選項按鈕。
在PauseMenuPanel下創建新的Panel命名為SelectionTabImagesPanel,刪除已有的組件(只保留Transform組件),其他配置如下:
在SelectionTabImagesPanel下創建Image命名為SelectionTabImage,組件配置如下:
然后復制6份如下:
(6)創建SelectionTabButtonsPanel
在PauseMenuPanel下創建新的Panel命名為SelectionTabButtonsPanel,刪除已有的組件(只保留Transform組件),其他配置如下:
在SelectionTabButtonsPanel下創建Image命名為SelectionButton,組件配置如下:
給SelectionButton添加UI -> Text(Text Mesh Pro),其組件設置如下:
SelectionButton復制6份如下:
除了保留第一個的文本內容,刪除其他button的文本內容:
3、創建UIManager.cs腳本?
在Assets/Scripts/UI下創建新腳本命名為UIManager.cs。
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;public class UIManager : SingletonMonobehaviour<UIManager>
{private bool _pauseMenuOn = false;[SerializeField] private GameObject pauseMenu = null;[SerializeField] private GameObject[] menuTabs = null;[SerializeField] private Button[] menuButtons = null;public bool PauseMenuOn { get => _pauseMenuOn; set => _pauseMenuOn = value; }private void Awake(){base.Awake();pauseMenu.SetActive(false);}// Update is called once per frameprivate void Update(){PauseMenu();}private void PauseMenu(){// Toggle pause menu if escape is pressedif(Input.GetKeyDown(KeyCode.Escape)){if (PauseMenuOn){DisablePauseMenu();}else{EnablePauseMenu();}}}private void EnablePauseMenu(){PauseMenuOn = true;Player.Instance.PlayerInputIsDisabled = true;Time.timeScale = 0;pauseMenu.SetActive(true);// Trigger garbage collector// 當暫停游戲時,抓住機會觸發系統垃圾收集System.GC.Collect();// Highlight selected buttonHighlightButtonForSelectedTab();}private void DisablePauseMenu(){PauseMenuOn = false;Player.Instance.PlayerInputIsDisabled = false;Time.timeScale = 1;pauseMenu.SetActive(false);}private void HighlightButtonForSelectedTab(){for(int i = 0; i < menuTabs.Length; i++){if (menuTabs[i].activeSelf){SetButtonColorToActive(menuButtons[i]);}else{SetButtonColorToInactive(menuButtons[i]);}}}private void SetButtonColorToActive(Button button){ColorBlock colors = button.colors;colors.normalColor = colors.pressedColor;button.colors = colors;}private void SetButtonColorToInactive(Button button){ColorBlock colors = button.colors;colors.normalColor = colors.disabledColor;button.colors = colors;}// 該函數放在SelectionButton的onClick事件中private void SwitchPauseMenuTab(int tabNum){for(int i = 0; i < menuTabs.Length; i++){if(i != tabNum){menuTabs[i].SetActive(false);}else{menuTabs[i].SetActive(true);}}HighlightButtonForSelectedTab();}}
4、配置UI對象
給UI對象添加UIManger組件,其他配置如下:
配置SelectionButton對象:
第1個SelectionButton的入參剛好是0,對于第2個SelectionButton(1),其配置如下:
依次配置其他SelectionButton。
5、運行游戲
游戲過程中,按Esc鍵可以進入菜單界面。