天津市建設(shè)工程評標(biāo)專家網(wǎng)站谷歌google官網(wǎng)下載
文章目錄
- 一、 介紹和知識點
- 九、UnityFacade 門面設(shè)計模式
- 二、 聲音全局管理器
- 測試音頻代碼
- UI全局管理器
- 父類抽象類 BaseManager
- 子類 UIManager
- 四、 UI按鈕的引用
- 父類 BasePanel
- 子類主面板 MainPanel
- 子類 游戲中 GamePanel
- 子類 游戲結(jié)果 ResultPanel
- 角色動畫器、控制角色移動
- 游戲獎懲道具
- 在這里插入圖片描述
一、 介紹和知識點
玩家通過跳躍踩磚塊,達(dá)到相應(yīng)的百分比,即可過關(guān)。
有3個關(guān)卡
可以暫停
堆棧
數(shù)據(jù)字典
枚舉
UnityFacade 門面設(shè)計模式
從資源文件中獲取音頻文件
九、UnityFacade 門面設(shè)計模式
這是一個UnityFacade類的代碼,它是一個單例類,用于管理游戲中的各種Manager,包括AudioManager、UIManager、GameManager和SaveManager。下面是代碼的逐行注釋:```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UnityFacade : MonoBehaviour
{private AudioManager _audioManager; //聲明一個私有的AudioManager對象private UIManager _uiManager; //聲明一個私有的UIManager對象private GameManager _gameManager; //聲明一個私有的GameManager對象private SaveManager _saveManager; //聲明一個私有的SaveManager對象private float _timer; //聲明一個私有的計時器變量//聲明一個公有的計時器屬性public float Timer{get { return _timer; }set { _timer = value; }}//聲明一個公有的GameManager屬性public GameManager GameManager{get { return _gameManager; }}//聲明一個公有的UIManager屬性public UIManager UiManager{get { return _uiManager; }}//聲明一個公有的AudioManager屬性public AudioManager AudioManager{get { return _audioManager; }}//聲明一個公有的SaveManager屬性public SaveManager SaveManager{get { return _saveManager; }}//聲明一個私有的靜態(tài)UnityFacade對象private static UnityFacade _instance;//聲明一個公有的靜態(tài)UnityFacade對象,用于獲取UnityFacade的單例public static UnityFacade Instance{get { return _instance; }}//在Awake中初始化單例private void Awake(){if (_instance == null){_instance = this;}}void Start(){//實例化所有Manager_audioManager = new AudioManager();_uiManager = new UIManager();_gameManager = new GameManager();_saveManager = new SaveManager();//調(diào)用所有的Manager的OnInit方法_audioManager.OnInit();_uiManager.OnInit();_saveManager.OnInit();_gameManager.OnInit();}// Update is called once per framevoid Update(){//調(diào)用所有Manager的OnUpdate方法_audioManager.OnUpdate();_uiManager.OnUpdate();_gameManager.OnUpdate();_saveManager.OnUpdate();}//在銷毀對象時調(diào)用所有Manager的OnDestroy方法private void OnDestroy(){_audioManager.OnDestroy();_uiManager.OnDestroy();_gameManager.OnDestroy();_saveManager.OnDestroy();}//啟動計時器倒計時public void StartTimerCountDown(){StartCoroutine(_gameManager.TimerCountIEnumerator());}//生成獎勵物品public void SpawnAward(){_gameManager.SpawnAward();}//生成懲罰物品public void SpawnPunishment(){_gameManager.SpawnPunishment();}
}
UnityFacade類是一個單例類,用于管理游戲中的各種Manager,包括AudioManager、UIManager、GameManager和SaveManager。在Start函數(shù)中,實例化所有Manager并調(diào)用其OnInit方法,然后在Update函數(shù)中調(diào)用所有Manager的OnUpdate方法,確保所有Manager都在運(yùn)行。在OnDestroy函數(shù)中,調(diào)用所有Manager的OnDestroy方法,確保在銷毀對象時所有Manager都被正確銷毀。此外,UnityFacade類還提供了一些公有方法,如StartTimerCountDown、SpawnAward和SpawnPunishment,用于管理游戲中的一些功能。
二、 聲音全局管理器
這段代碼的作用是實現(xiàn)游戲中的音頻管理,具體包括以下功能:
-
創(chuàng)建音頻管理器:在OnInit方法中,創(chuàng)建一個名為"AudiManager"的GameObject,并將其作為音頻管理器的根節(jié)點。同時,創(chuàng)建名為"BGM"和"Sound"的子節(jié)點,并將背景音樂和音效的AudioSource組件分別添加到這兩個子節(jié)點上。
-
加載音頻資源:在LoadAudioResources方法中,使用Resources.Load方法加載所有的背景音樂和音效資源,并將它們存儲在對應(yīng)的字典中。其中,BGMType和SoundType是兩個枚舉類型,用于區(qū)分不同的背景音樂和音效。
-
播放背景音樂:通過PlayBGM方法,可以播放指定類型的背景音樂。在此方法中,通過字典查找找到對應(yīng)的音頻資源,并將其設(shè)置為_bgmAudioSource的clip屬性,最后調(diào)用Play方法開始播放背景音樂。
-
停止背景音樂:通過StopBGM方法,可以停止當(dāng)前正在播放的背景音樂。
-
播放音效:通過PlaySound方法,可以播放指定類型的音效。在此方法中,通過字典查找找到對應(yīng)的音頻資源,并調(diào)用PlayOneShot方法播放音效。
-
單例模式:通過將AudioManager繼承自BaseManager,并利用BaseManager的單例模式,確保全局只有一個音頻管理器實例。
-
枚舉類型:通過BGMType和SoundType枚舉類型,區(qū)分不同的背景音樂和音效。
-
繼承和虛方法:將AudioManager繼承自BaseManager,并重寫OnInit方法,實現(xiàn)了音頻管理器的抽象和多態(tài)。
-
Resources功能:使用Unity中的Resources.Load方法加載音頻資源,實現(xiàn)了游戲中的音頻動態(tài)加載和卸載。
-
委托和事件:通過定義PlayBGMEvent和StopBGMEvent委托類型和相應(yīng)的事件,使得其他游戲?qū)ο罂梢杂嗛喓晚憫?yīng)這些事件,實現(xiàn)了游戲中音頻播放和停止的協(xié)作功能。
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class AudioManager : BaseManager
{//定義兩個音源組件private AudioSource _bgmAudioSource;private AudioSource _soundAudioSource;//定義背景音樂和音效的字典private Dictionary<BGMType, AudioClip> _bgmDict;private Dictionary<SoundType, AudioClip> _soundDict;//初始化方法public override void OnInit(){//創(chuàng)建音頻管理器、背景音樂、音效三個游戲?qū)ο?#xff0c;并設(shè)置它們的父節(jié)點GameObject audioManagerGo = new GameObject("AudioManager");GameObject bgm = new GameObject("BGM");GameObject sound = new GameObject("Sound");bgm.transform.SetParent(audioManagerGo.transform);sound.transform.SetParent(audioManagerGo.transform);//給背景音樂和音效游戲?qū)ο筇砑右粼唇M件_bgmAudioSource = bgm.AddComponent<AudioSource>();_soundAudioSource = sound.AddComponent<AudioSource>();//設(shè)置音源組件的初始值,背景音樂循環(huán)播放,音效不循環(huán),都不立即播放_bgmAudioSource.loop = true;_bgmAudioSource.playOnAwake = true;_soundAudioSource.loop = false;_soundAudioSource.playOnAwake = false;//設(shè)置背景音樂的默認(rèn)音量_bgmAudioSource.volume = 0.1f;//加載聲音資源LoadAudioResources();}//加載聲音資源private void LoadAudioResources(){//背景音樂資源的加載AudioClip aboutUsClip = Resources.Load<AudioClip>("BGM/AboutUs");AudioClip gameBgm1Clip = Resources.Load<AudioClip>("BGM/GameBgm1");AudioClip gameBgm2Clip = Resources.Load<AudioClip>("BGM/GameBgm2");AudioClip gameBgm3Clip = Resources.Load<AudioClip>("BGM/GameBgm3");AudioClip gameBgm4Clip = Resources.Load<AudioClip>("BGM/GameBgm4");AudioClip gameBgm5Clip = Resources.Load<AudioClip>("BGM/GameBgm5");AudioClip mainPanelClip = Resources.Load<AudioClip>("BGM/MainPanel");//將背景音樂資源添加到字典中_bgmDict = new Dictionary<BGMType, AudioClip>();_bgmDict.Add(BGMType.AboutUS, aboutUsClip);_bgmDict.Add(BGMType.BGM_1, gameBgm1Clip);_bgmDict.Add(BGMType.BGM_2, gameBgm2Clip);_bgmDict.Add(BGMType.BGM_3, gameBgm3Clip);_bgmDict.Add(BGMType.BGM_4, gameBgm4Clip);_bgmDict.Add(BGMType.BGM_5, gameBgm5Clip);_bgmDict.Add(BGMType.Main_Panel, mainPanelClip);//音效音樂資源的加載AudioClip awardClip = Resources.Load<AudioClip>("Sounds/Award");AudioClip brickClip = Resources.Load<AudioClip>("Sounds/Brick");AudioClip brick1Clip = Resources.Load<AudioClip>("Sounds/Brick1");AudioClip brickDestroyClip = Resources.Load<AudioClip>("Sounds/Brick_Destroy");AudioClip buttonClip = Resources.Load<AudioClip>("Sounds/Button");AudioClip failedClip = Resources.Load<AudioClip>("Sounds/Failed");AudioClip fallDownClip = Resources.Load<AudioClip>("Sounds/Fall_Down");AudioClip jumpClip = Resources.Load<AudioClip>("Sounds/Jump");AudioClip punishmentClip = Resources.Load<AudioClip>("Sounds/Punishment");AudioClip winClip = Resources.Load<AudioClip>("Sounds/Win");AudioClip winPerfectClip = Resources.Load<AudioClip>("Sounds/WinPerfect");//將音效資源添加到字典中_soundDict = new Dictionary<SoundType, AudioClip>();_soundDict.Add(SoundType.Award, awardClip);_soundDict.Add(SoundType.Brick, brickClip);_soundDict.Add(SoundType.Brick_1, brick1Clip);_soundDict.Add(SoundType.Brick_Destroy, brickDestroyClip);_soundDict.Add(SoundType.Button, buttonClip);_soundDict.Add(SoundType.Failed, failedClip);_soundDict.Add(SoundType.Fall_Down, fallDownClip);_soundDict.Add(SoundType.Jump, jumpClip);_soundDict.Add(SoundType.Punishment, punishmentClip);_soundDict.Add(SoundType.Win, winClip);_soundDict.Add(SoundType.WinPerfect, winPerfectClip);}//播放背景音樂public void PlayBGM(BGMType bgmType){//停止當(dāng)前背景音樂的播放_bgmAudioSource.Stop();//設(shè)置新的背景音樂,并播放_bgmAudioSource.clip = _bgmDict[bgmType];_bgmAudioSource.Play();}//播放音效public void PlaySound(SoundType soundType){//停止當(dāng)前音效的播放_soundAudioSource.Stop();//設(shè)置新的音效,并播放_soundAudioSource.clip = _soundDict[soundType];_soundAudioSource.Play();}//關(guān)閉BGM播放public void StopBGM(){_bgmAudioSource.Stop();}//音量控制public void ControlVolume(float bgmVolume, float soundVolume){_bgmAudioSource.volume = bgmVolume;_soundAudioSource.volume = soundVolume;}//以下三個方法都是空實現(xiàn),不做任何操作public override void OnUpdate(){}public override void OnDestroy(){}
}//定義背景音樂類型枚舉
public enum BGMType
{AboutUS,BGM_1,BGM_2,BGM_3,BGM_4,BGM_5,Main_Panel
}//定義音效類型枚舉
public enum SoundType
{Award, Brick, Brick_1, Brick_Destroy, Button, Failed, Fall_Down, Jump, Punishment, Win, WinPerfect
}
測試音頻代碼
下面這兩段代碼,用于測試音頻組件,可以復(fù)用
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class aaa : MonoBehaviour
{private AudioManager _audioManager;public AudioManager AudioManager{get { return _audioManager; }}private static aaa _instance;public static aaa Instance{get { return _instance; }}private void Awake(){if (_instance == null){_instance = this;}}// Use this for initializationvoid Start(){//實例化所有Manager_audioManager = new AudioManager();// 調(diào)用所有的Manager的OnInit方法_audioManager.OnInit();}// Update is called once per framevoid Update(){_audioManager.OnUpdate();}private void OnDestroy(){_audioManager.OnDestroy();}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class TestAudioPanel : MonoBehaviour
{public Button playSoundBtn;public Button playBGMBtn;public Slider volumeSlider;// Use this for initializationvoid Start () {playSoundBtn.onClick.AddListener(delegate { PlaySoundButtonClicked(); });playBGMBtn.onClick.AddListener(delegate { PlayBGMButtonClicked(); });volumeSlider.onValueChanged.AddListener(delegate(float arg0) { SliderValueChanged(arg0); });}// Update is called once per framevoid Update () {}private void PlaySoundButtonClicked(){aaa.Instance.AudioManager.PlaySound(SoundType.Button);}private void PlayBGMButtonClicked(){aaa.Instance.AudioManager.PlayBGM(BGMType.Main_Panel);}private void SliderValueChanged(float value){aaa.Instance.AudioManager.ControlVolume(value,value);}}
UI全局管理器
父類抽象類 BaseManager
該抽象類定義了一個基本的管理器,其具體實現(xiàn)可以繼承該類并實現(xiàn)三個抽象方法,以滿足具體的需求。其中,OnInit() 方法用于初始化管理器、OnUpdate() 方法用于在每幀更新管理器、OnDestroy() 方法用于銷毀管理器。這樣,我們就可以通過繼承該類來編寫各種各樣的管理器,從而更好地管理游戲中的各種資源、對象和邏輯。
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public abstract class BaseManager // 定義抽象類 BaseManager
{public abstract void OnInit(); // 聲明抽象方法 OnInit()public abstract void OnUpdate(); // 聲明抽象方法 OnUpdate()public abstract void OnDestroy(); // 聲明抽象方法 OnDestroy()}
子類 UIManager
這段代碼主要實現(xiàn)了一個UI管理器,其中包括了以下功能:
- 加載面板:根據(jù)傳入的面板類型,從預(yù)設(shè)體字典中獲取對應(yīng)的預(yù)設(shè)體并實例化,然后執(zhí)行該面板的OnEnter方法,同時將該面板入棧。
- 關(guān)閉(彈出)頂層面板:從棧中彈出頂層面板,并執(zhí)行該面板的OnExit方法,同時恢復(fù)下一個面板的OnResume方法。
- 初始化:獲取Canvas的Transform屬性,初始化預(yù)設(shè)體字典和已實例化面板字典,并加載第一個面板。
- 枚舉類型:定義了PanelType枚舉類型,包括了所有的面板類型。
補(bǔ)充說明:
- BaseManager是一個抽象類,該UIManager類繼承自BaseManager,并且需要實現(xiàn)其中的三個虛函數(shù):OnInit、OnUpdate和OnDestroy。
- 該UIManager類中還定義了一個InstantiatedPanelDict屬性,用于獲取已實例化面板字典。
```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UIManager : BaseManager
{private Transform _canvasTransform; //Canvas的Transform組件private Dictionary<PanelType, GameObject> _uiPanelPrefabDict; //UI面板預(yù)制體字典private Dictionary<PanelType, BasePanel> _instantiatedPanelDict; //實例化的UI面板字典private Stack<BasePanel> _panelStack; //UI面板棧public Dictionary<PanelType, BasePanel> InstantiatedPanelDict{get { return _instantiatedPanelDict; }}/// <summary>/// 加載面板/// </summary>/// <param name="panelType"></param>/// <returns></returns>public BasePanel PushPanel(PanelType panelType){//從實例化的面板字典中獲取該面板BasePanel panel = null;_instantiatedPanelDict.TryGetValue(panelType, out panel);if (panel == null){//說明該面板從未實例化過(從未入棧),此處需要實例化GameObject panelPrefab = _uiPanelPrefabDict[panelType];GameObject panelGO = GameObject.Instantiate(panelPrefab, _canvasTransform, false);panel = panelGO.GetComponent<BasePanel>();_instantiatedPanelDict.Add(panelType, panel); //將該面板加入實例化的面板字典中}else{//說明該面板已經(jīng)實例化,入棧后被出棧,處于被禁用狀態(tài),需要重新啟用panel.gameObject.SetActive(true);}//執(zhí)行該P(yáng)anel的OnEnterpanel.OnEnter();if (_panelStack.Count > 0){BasePanel peekPanel = _panelStack.Peek();peekPanel.OnPause();}_panelStack.Push(panel); //將該面板入棧return panel;}/// <summary>/// 關(guān)閉(彈出)頂層面板/// </summary>public void PopPanel(){if (_panelStack.Count > 0){BasePanel peekPanel = _panelStack.Pop();peekPanel.OnExit();if (_panelStack.Count > 0){BasePanel secPeekPanel = _panelStack.Peek();secPeekPanel.OnResume();}}}public override void OnInit(){//獲取掛載Canvas的Transform屬性_canvasTransform = GameObject.Find("Canvas").transform;//初始化面板預(yù)制體字典_uiPanelPrefabDict = new Dictionary<PanelType, GameObject>();_uiPanelPrefabDict.Add(PanelType.Main, Resources.Load<GameObject>("UIPanel/Panel_Main"));_uiPanelPrefabDict.Add(PanelType.Game, Resources.Load<GameObject>("UIPanel/Panel_Game"));_uiPanelPrefabDict.Add(PanelType.Result, Resources.Load<GameObject>("UIPanel/Panel_Result"));_uiPanelPrefabDict.Add(PanelType.Battle, Resources.Load<GameObject>("UIPanel/Panel_Battle"));_uiPanelPrefabDict.Add(PanelType.Fail, Resources.Load<GameObject>("UIPanel/Panel_Fail"));_uiPanelPrefabDict.Add(PanelType.Success, Resources.Load<GameObject>("UIPanel/Panel_Success"));_uiPanelPrefabDict.Add(PanelType.Pause, Resources.Load<GameObject>("UIPanel/Panel_Pause"));_uiPanelPrefabDict.Add(PanelType.Level, Resources.Load<GameObject>("UIPanel/Panel_Level"));_uiPanelPrefabDict.Add(PanelType.Index, Resources.Load<GameObject>("UIPanel/Panel_Index"));//初始化_instantiatedPanelDict = new Dictionary<PanelType, BasePanel>();_panelStack = new Stack<BasePanel>();//加載第一個Panel// PushPanel(PanelType.Main);}public override void OnUpdate(){}public override void OnDestroy(){}
}public enum PanelType
{Main,Game,Result,Battle,Fail,Success,Pause,Level,Index
}
這段代碼實現(xiàn)了一個UI管理器,用于管理游戲中的UI面板。其中,PushPanel()
函數(shù)用于加載面板,PopPanel()
函數(shù)用于關(guān)閉頂層面板,OnInit()
函數(shù)用于在UI管理器被初始化時加載第一個面板。
UI管理器中使用了一個面板棧_panelStack
,用于存儲當(dāng)前打開的所有UI面板,實現(xiàn)了UI面板的層級管理。同時,還使用了兩個面板字典_uiPanelPrefabDict
和_instantiatedPanelDict
,用于存儲預(yù)制體和實例化的面板。
代碼中使用了單例模式實現(xiàn)了UI管理器的唯一性。同時,還繼承了BaseManager
類,實現(xiàn)了對游戲管理器的統(tǒng)一管理。
四、 UI按鈕的引用
父類 BasePanel
這四個方法是狀態(tài)機(jī)中狀態(tài)的生命周期方法,用于管理狀態(tài)的進(jìn)入、暫停、恢復(fù)和退出。
具體來說,當(dāng)一個狀態(tài)被切換到時,首先會調(diào)用OnEnter()方法,用于初始化狀態(tài)的數(shù)據(jù)和變量。當(dāng)狀態(tài)被暫停時(例如切換到其他狀態(tài)),會調(diào)用OnPause()方法,用于暫停狀態(tài)的邏輯和動畫。當(dāng)狀態(tài)恢復(fù)時(例如從其他狀態(tài)切換回該狀態(tài)),會調(diào)用OnResume()方法,用于恢復(fù)狀態(tài)的邏輯和動畫。當(dāng)狀態(tài)被退出時,會調(diào)用OnExit()方法,用于清理狀態(tài)的數(shù)據(jù)和變量。
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public abstract class BasePanel : MonoBehaviour // 定義一個抽象類 BasePanel,繼承自 MonoBehaviour 類
{public abstract void OnEnter(); // 聲明一個抽象方法 OnEnter,由子類實現(xiàn)public abstract void OnPause(); // 聲明一個抽象方法 OnPause,由子類實現(xiàn)public abstract void OnResume(); // 聲明一個抽象方法 OnResume,由子類實現(xiàn)public abstract void OnExit(); // 聲明一個抽象方法 OnExit,由子類實現(xiàn)}
子類主面板 MainPanel
- 定義MainPanel類,繼承自BasePanel。
- 定義開始按鈕和關(guān)閉按鈕兩個公共屬性。
- 在Start()方法中添加開始按鈕和關(guān)閉按鈕的點擊事件監(jiān)聽器。
- 在StartButtonClicked()方法中調(diào)用UnityFacade.Instance.UiManager.PushPanel()方法,實現(xiàn)面板的切換到GamePanel。
- 在CloseButtonClicked()方法中調(diào)用UnityFacade.Instance.UiManager.PopPanel()方法,實現(xiàn)當(dāng)前面板的彈出。
- 在OnEnter()方法中實現(xiàn)面板進(jìn)入時的操作。
- 在OnPause()方法中禁用開始按鈕和關(guān)閉按鈕,實現(xiàn)面板暫停時的操作。
- 在OnResume()方法中啟用開始按鈕和關(guān)閉按鈕,實現(xiàn)面板恢復(fù)時的操作。
- 在OnExit()方法中隱藏當(dāng)前面板,實現(xiàn)面板退出時的操作。
```using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class MainPanel : BasePanel //繼承自BasePanel
{public Button startBtn; //開始按鈕public Button closeBtn; //關(guān)閉按鈕private void Start(){//添加開始按鈕點擊事件監(jiān)聽器startBtn.onClick.AddListener(delegate { StartButtonClicked(); });//添加關(guān)閉按鈕點擊事件監(jiān)聽器closeBtn.onClick.AddListener(delegate { CloseButtonClicked(); });}private void StartButtonClicked(){//點擊開始按鈕,推入GamePanelUnityFacade.Instance.UiManager.PushPanel(PanelType.Game);}private void CloseButtonClicked(){//點擊關(guān)閉按鈕,彈出當(dāng)前面板UnityFacade.Instance.UiManager.PopPanel();}public override void OnEnter(){//面板進(jìn)入時調(diào)用此方法Debug.Log("MainPanel加載了");}public override void OnPause(){//面板暫停時調(diào)用此方法,禁用開始按鈕和關(guān)閉按鈕startBtn.interactable = false;closeBtn.interactable = false;}public override void OnResume(){//面板恢復(fù)時調(diào)用此方法,啟用開始按鈕和關(guān)閉按鈕startBtn.interactable = true;closeBtn.interactable = true;}public override void OnExit(){//面板退出時調(diào)用此方法,隱藏當(dāng)前面板this.gameObject.SetActive(false);}
}```
子類 游戲中 GamePanel
這段代碼實現(xiàn)了一個游戲面板(GamePanel),繼承自一個基礎(chǔ)面板(BasePanel),并實現(xiàn)了在面板中的按鈕點擊事件。具體來說,這個面板有兩個按鈕:resultBtn和closeBtn,點擊resultBtn會跳轉(zhuǎn)到一個結(jié)果面板(PanelType.Result),而點擊closeBtn會關(guān)閉當(dāng)前面板。
在 Start() 方法中,通過監(jiān)聽按鈕的點擊事件來實現(xiàn)按鈕的功能,即 resultBtn 點擊時調(diào)用 ResultButtonClicked() 方法,closeBtn 點擊時調(diào)用 CloseButtonClicked() 方法。ResultButtonClicked() 方法中調(diào)用了 UnityFacade.UiManager.PushPanel() 方法,用于跳轉(zhuǎn)到結(jié)果面板,而 CloseButtonClicked() 方法中調(diào)用了 UnityFacade.UiManager.PopPanel() 方法,用于關(guān)閉當(dāng)前面板。
在 OnEnter() 方法中,當(dāng)這個游戲面板被打開時,會輸出一個 Debug.Log() 信息,提示面板被打開了。
在 OnPause() 方法中,當(dāng)這個游戲面板被暫停時,會將 resultBtn 和 closeBtn 的 interactable 屬性設(shè)置為 false,即這兩個按鈕將不再響應(yīng)點擊事件。
在 OnResume() 方法中,當(dāng)這個游戲面板從暫停狀態(tài)中恢復(fù)時,會將 resultBtn 和 closeBtn 的 interactable 屬性設(shè)置為 true,即這兩個按鈕將重新響應(yīng)點擊事件。
在 OnExit() 方法中,當(dāng)這個游戲面板被關(guān)閉時,會將這個游戲面板的 gameObject 設(shè)置為不可見,即關(guān)閉這個游戲面板。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;// 繼承自 BasePanel
public class GamePanel : BasePanel
{// 定義兩個按鈕public Button resultBtn;public Button closeBtn;// 在 Start 函數(shù)中添加按鈕點擊事件監(jiān)聽private void Start(){resultBtn.onClick.AddListener(delegate { ResultButtonClicked(); });closeBtn.onClick.AddListener(delegate { CloseButtonClicked(); });}// 點擊結(jié)果按鈕的處理函數(shù)private void ResultButtonClicked(){// 調(diào)用 UnityFacade 的 UiManager 的 PushPanel 函數(shù),打開結(jié)果面板UnityFacade.Instance.UiManager.PushPanel(PanelType.Result);}// 點擊關(guān)閉按鈕的處理函數(shù)private void CloseButtonClicked(){// 調(diào)用 UnityFacade 的 UiManager 的 PopPanel 函數(shù),關(guān)閉當(dāng)前面板UnityFacade.Instance.UiManager.PopPanel();}// 進(jìn)入面板時的處理函數(shù)public override void OnEnter(){Debug.Log("GamePanel打開了");}// 暫停面板時的處理函數(shù)public override void OnPause(){// 將兩個按鈕設(shè)置為不可用resultBtn.interactable = false;closeBtn.interactable = false;}// 恢復(fù)面板時的處理函數(shù)public override void OnResume(){// 將兩個按鈕設(shè)置為可用resultBtn.interactable = true;closeBtn.interactable = true;}// 退出面板時的處理函數(shù)public override void OnExit(){// 將自身的 gameObject 設(shè)置為不可見this.gameObject.SetActive(false);}
}
子類 游戲結(jié)果 ResultPanel
它實現(xiàn)了一個游戲面板,名為ResultPanel。這個面板里有一個按鈕,名為closeBtn,點擊它可以關(guān)閉當(dāng)前面板。這個面板繼承自BasePanel類,因此實現(xiàn)了BasePanel類中定義的四個方法:OnEnter、OnPause、OnResume、OnExit。其中,OnEnter方法是在面板打開時被調(diào)用的,OnPause方法是在面板被暫停時被調(diào)用的,OnResume方法是在面板恢復(fù)時被調(diào)用的,OnExit方法是在面板關(guān)閉時被調(diào)用的。在這里,OnEnter方法只是打印了一條調(diào)試信息。Start方法用于初始化面板,它給closeBtn按鈕添加了一個事件監(jiān)聽器,當(dāng)按鈕被點擊時,會執(zhí)行CloseButtonClicked方法。CloseButtonClicked方法中,通過UnityFacade.Instance.UiManager.PopPanel()方法關(guān)閉當(dāng)前面板。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class ResultPanel : BasePanel
{public Button closeBtn;public override void OnEnter(){Debug.Log("ResultPanel打開了");}public override void OnPause(){}public override void OnResume(){}public override void OnExit(){this.gameObject.SetActive(false);}// Use this for initializationvoid Start () {closeBtn.onClick.AddListener(delegate { CloseButtonClicked(); });}private void CloseButtonClicked(){UnityFacade.Instance.UiManager.PopPanel();}// Update is called once per framevoid Update () {}
}
角色動畫器、控制角色移動
角色可以跳躍、行走
游戲獎懲道具
掉血的磚塊:用數(shù)組存儲四張圖片,踩一下hp-1。
public void Injured(){_hp--;if (_hp > 0){if (_hp == 3){UnityFacade.Instance.GameManager.AddTouchCount();}UnityFacade.Instance.AudioManager.PlaySound(SoundType.Brick);_spriteRenderer.sprite = sprites[4 - _hp];}else{UnityFacade.Instance.AudioManager.PlaySound(SoundType.Brick_Destroy);Destroy(this.gameObject);}}
保護(hù)罩:玩家得到后,不受任何傷害
protectorGO.SetActive(true);
紅色感嘆號炸彈:計時器減少10秒鐘
綠色感嘆號:計時器時間增加10秒鐘
死亡小球:玩家碰到后
直接游戲結(jié)束
private void Move(){if (Math.Abs(_rigidbody2D.velocity.x) < 0.05f&&_isOnGround){if (_direction == MoveDirection.Left){ _rigidbody2D.velocity=new Vector2((int)MoveDirection.Right*vSpeed,0);_direction = MoveDirection.Right;}else if (_direction == MoveDirection.Right){_rigidbody2D.velocity=new Vector2((int)MoveDirection.Left*vSpeed,0);_direction = MoveDirection.Left;}}}
過關(guān)星星動畫: