從零開始做一個SLG遊戲(六):UI系統擴充套件
繼續以確認框作為例子:確認框這種形式在不同的地方都會使用到。比如上一篇文章中提到的科技樹功能,每點一個科技,都會有一個對應的確認框。
我們不可能也沒有必要針對每一個科技都製作一個新的確認框,所以除了開啟一個新的UI之外,我們還需要一些擴充套件性的功能。而確認框,將是一個非常典型的例子。
確認框的功能,其實包含兩層含義:
1.上一個UI會傳遞一些資訊給下一個UI,然後在下一個UI中,這些資訊會顯示出來。(比如科技樹確認框中“你確定要提升XXX科技嗎?”,或者關閉遊戲時“你確定要退出遊戲嗎?”這一類的話)
2.上一個UI會將自身的某些方法傳遞給下一個UI,這樣下一個UI就會執行這些方法。(比如提升科技的確認框,點了確認會提升對應的科技,退出遊戲的確認框,點了確定會退出遊戲)
所以,說白了就是要傳遞一些資訊給下一個UI,所以我們需要定義一個新的類,用來儲存這些資訊:
- public class UIEvent
- {
- public UIType Type { get; private set; }
- public Action Action { get; private set; }
- public Hashtable Msg { get; private set; }
- public UIEvent(UIType type)
- {
- Type = type;
- Action = null;
- Msg = null;
- }
- public UIEvent(UIType type, Hashtable msg)
- {
- Type = type;
- Action = null;
- Msg = msg;
- }
- public UIEvent(UIType type, Action act)
- {
- Type = type;
- Action = act;
- Msg = null;
- }
- public UIEvent(UIType type, Action act, Hashtable msg)
- {
- Type = type;
- Action = act;
- Msg = msg;
- }
- }
內容很簡單,UIType就不多說了,Action是一個委託,用於將上一個UI的函式傳遞過來,Msg是一個Hashtable,用於儲存一些資訊。
接下來去修改UIRoot類和BaseUI類:
- public class BaseUI : MonoBehaviour
- {
- ……
- public void OpenUI(UIEvent uiEvent)//給OpenUI加入引數
- {
- gameObject.SetActive(true);
- }
- }
- public class UIRoot : MonoBehaviour {
- ……
- public void OpenNormalUI(UIEvent uiEvent)
- {
- UIType uiType = uiEvent.Type;
- ……
- CurrentUI.OpenUI(uiEvent);
- }
- public void OpenKeepAboveUI(UIEvent uiEvent)
- {
- UIType uiType = uiEvent.Type;
- ……
- theUI.OpenUI(uiEvent);
- }
- }
之後更新所有用過這幾個函式的地方:
首先是開啟StartUI的地方
- public class UIRoot : MonoBehaviour {
- ……
- private void Start()
- {
- OpenNormalUI(new UIEvent(UIType.StartUI));
- }
- ……
- }
- 然後是StartUI
- public class StartUI : BaseUI {
- ……
- private void StartGame()
- {
- UIRoot.Instance.OpenNormalUI(new UIEvent(UIType.GameSettingUI));
- }
- }
而後是GameSettingUI
- public class GameSettingUI : BaseUI {
- ……
- public void StartGame()
- {
- UIRoot.Instance.OpenNormalUI(new UIEvent(UIType.StartUI));
- }
- public void OpenTestUI()
- {
- UIRoot.Instance.OpenKeepAboveUI(new UIEvent(UIType.TestAboveUI));
- }
- }
接下來是做一個確認框,確認框的UI主要包含3個部分:資訊描述,確認按鈕,取消按鈕
如圖,和以前流程一樣,做好了CheckBoxUI組建並放到了相應的位置。
資訊描述的組建是Content,確認按鈕是OKButton,取消是CancleButton。給CheckBoxUI掛上如下指令碼用以初始化。
- public class CheckBoxUI : BaseUI
- {
- private Text Text;
- private Button OKButton;
- private Button CancelButton;
- private void Awake()
- {
- Text = UITool.FindChildByName(gameObject, "Content").GetComponent<Text>();
- OKButton = UITool.FindChildByName(gameObject, "OKButton").GetComponent<Button>();
- OKButton.onClick.AddListener(OnClickOk);
- CancelButton = UITool.FindChildByName(gameObject, "CancelButton").GetComponent<Button>();
- CancelButton.onClick.AddListener(OnClickCancel);
- }
- private void OnClickOk()
- {
- }
- private void OnClickCancel()
- {
- }
- }
在UIConfig中新增對應的配置:
- public class UIConfig
- {
- public static Dictionary<UIType, string> UIPath = new Dictionary<UIType, string>
- {
- ……
- { UIType.CheckBoxUI,"UIPrefabs/CheckBoxUI" },
- };
- }
- public enum UIType
- {
- ……
- CheckBoxUI,
- }
然後再在TestAboveUI中加入對應的開啟入口:
- public class TestAboveUI : BaseUI
- {
- ……
- private Button NewUIButton;
- private void Awake()
- {
- ……
- NewUIButton = UITool.FindChildByName(gameObject, "NewUIButton").GetComponent<Button>();
- NewUIButton.onClick.AddListener(OpenNewUI);
- }
- ……
- public void OpenNewUI()
- {
- }
- }
其中OpenNewUI就是用來開啟新的UI的:
如果在該函式內加一句
UIRoot.Instance.OpenKeepAboveUI(new UIEvent(UIType.CheckBoxUI));
就可以開啟確認框了,但是要做的並不僅僅是開啟確認框,而是要讓確認框顯示對應的文字,並且點了確認後,要實現改視窗中包含的某個程式碼。
所以UIEvent內需要加更多的東西,作為測試,希望確認框執行的效果是在控制檯列印“1111111111”,並且在確認框中顯示“是否需要列印”。
- public void OpenNewUI()
- {
- UIEvent uiEvent = new UIEvent(
- UIType.CheckBoxUI,
- () => {
- Debug.Log(111111111111);
- },
- new Hashtable
- {
- { "content","是否需要列印"},
- }
- );
- UIRoot.Instance.OpenKeepAboveUI(uiEvent);
- }
這裡面的()=>{Debug.Log(111111111111);}是一個lamda表示式,等同於
- public void OpenNewUI()
- {
- UIEvent uiEvent = new UIEvent(
- UIType.CheckBoxUI,
- showLog,
- new Hashtable
- {
- { "content","是否需要列印"},
- }
- );
- UIRoot.Instance.OpenKeepAboveUI(uiEvent);
- }
- void showLog()
- {
- Debug.Log(111111111111);
- }
而後是在CheckBoxUI裡面實現,首先,我們需要用到多型的特性,所以要修改一下BaseUI的程式碼:
- public class BaseUI : MonoBehaviour
- {
- ……
- public virtual void OpenUI(UIEvent uiEvent)
- {
- gameObject.SetActive(true);
- }
- ……
- }
將OpenUI函式變為虛擬函式。然後將CheckBoxUI修改一下:
- public class CheckBoxUI : BaseUI
- {
- ……
- private Action Action;
- ……
- public override void OpenUI(UIEvent uiEvent)
- {
- Text.text = uiEvent.Msg["content"].ToString();
- if (uiEvent.Action != null)
- {
- Action = uiEvent.Action;
- }
- base.OpenUI(uiEvent);
- }
- private void OnClickOk()
- {
- Action();
- Action = null;
- UIRoot.Instance.CloseKeepAboveUI();
- }
- private void OnClickCancel()
- {
- Action = null;
- UIRoot.Instance.CloseKeepAboveUI();
- }
- }
執行一下:
能夠成功的列印,並且顯示正確的資訊了。
自此,一個最為簡單的UI系統已經實現,接下來將實現的是遊戲基本的邏輯框架。
相關閱讀:
從零開始做一個SLG遊戲(一):六邊形網格
從零開始做一個SLG遊戲(二):用mesh實現簡單的地形
從零開始做一個SLG遊戲(三):用unity繪製圖形
從零開始做一個SLG遊戲(四):UI系統之主介面搭建
從零開始做一個SLG遊戲(五):UI系統之彈窗功能
作者:觀復
專欄地址:https://zhuanlan.zhihu.com/p/60049715
相關文章
- 從零開始做一個SLG遊戲(四):UI系統之主介面搭建遊戲UI
- 從零開始做一個SLG遊戲(五):UI系統之彈窗功能遊戲UI
- 從零開始做一個SLG遊戲(一):六邊形網格遊戲
- 從零開始做一個SLG遊戲(七):遊戲系統以及配置表遊戲
- 從零開始做一個SLG遊戲(八):配置表載入元件遊戲元件
- 從零開始做一個SLG遊戲(三):用unity繪製圖形遊戲Unity
- 從零開始建立一個 PHP 擴充套件PHP套件
- 從零開始做一個SLG遊戲(二):用mesh實現簡單的地形遊戲
- 《從零開始學Swift》學習筆記(Day 49)——擴充套件宣告Swift筆記套件
- 從零開始實現簡單 RPC 框架 2:擴充套件利器 SPIRPC框架套件
- PHP擴充套件開發就是一個自己的PHP擴充套件PHP套件
- 用Unity做個遊戲(五) – 編輯器擴充套件Unity遊戲套件
- 如何開始一個模組化可擴充套件的Web App套件WebAPP
- 從零開始, 開發一個 Web Office 套件 (3): 滑鼠事件Web套件事件
- 從零開始:用REACT寫一個格鬥遊戲(一)React遊戲
- 從零寫一個自動生成API文件的laravel擴充套件包APILaravel套件
- 《從零開始學Swift》學習筆記(Day 51)——擴充套件建構函式Swift筆記套件函式
- 一個月內從零開始做webOS開發人員Web
- JavaWeb——從零開始構建一個客戶管理系統(一)JavaWeb
- 巧用 ARKit 和 SpriteKit 從零開始做 AR 遊戲遊戲
- 使用半透明系統UI擴充套件Android檢視UI套件Android
- 《從零開始學Swift》學習筆記(Day 50)——擴充套件計算屬性、方法Swift筆記套件
- 從零開始:用REACT寫一個格鬥遊戲(二)React遊戲
- 從零點五開始用Unity做半個2D戰棋小遊戲(一)Unity遊戲
- PHP擴充套件開發教程2 – 編寫第一個擴充套件 hello worldPHP套件
- windows系統磁碟擴容/擴充套件Windows套件
- 手把手教你從零開始做一個好看的 APPAPP
- 從零開始開發一個 WebpackWeb
- 從零開始,開發一個 Web Office 套件(6):游標 & Click 事件Web套件事件
- 從零開始,開發一個 Web Office 套件(5):Mouse hover over textWeb套件
- 從零開始寫一個ExporterExport
- 如何開發一個 Notadd 擴充套件套件
- 從零開始實現放置遊戲(一)遊戲
- 一個可擴充套件的報警系統Quick-Alarm套件UI
- 從零開始仿寫一個抖音App——開始APP
- 從零開始實現放置遊戲(六):Excel批量匯入遊戲Excel
- 從零開始, 開發一個 Web Office 套件 (2): 富文字編輯器Web套件
- 從零開始, 開發一個 Web Office 套件 (1): 富文字編輯器Web套件