PureMVC在Unity游戏开发中的应用
作為開發人員,我們都想寫出優雅的代碼,可又苦于自身能力不知該如何下手,而框架的作用正在與能夠讓你規范的去開發。
之前寫Web的時候,總被要求采用MVC架構,的確非常好用,也從來沒有質疑過這種架構的好與不好。直到做游戲開發后,發現MVC架構其實很難應對游戲軟件的各種需求,諸如實時戰斗等。MVC特別適用于UI部分的開發,所以pureMVC我們同樣也主要用在UI方面,凡是與UI有一定交互的部分,我們都可以通過MVC進行架構。
PureMVC
PureMVC框架在Unity中的應用
官方中文文檔
pureMVC源碼鏈接 選擇standard版本
傳統MVC在使用上,View和Controller耦合度太高,很多邏輯代碼既可以寫在View層又可以寫在Controller層,而pureMVC引入中介者模式+消息機制來進行解耦。pureMVC仍然由Model-Controller-View組成,并且通過Facade統一進行管理。
Model層,采用代理模式,由Proxy處理數據訪問,增刪改查均是通過Proxy來處理,當檢測到數據改變后會發送消息Notification通知View和Controller
View層,采用中介者模式,由Mediator處理數據交互,通知Controller進行邏輯處理。
Controller層,采用命令模式Command拆分邏輯,便于復用。
簡單示例
以點擊Button改變Text為例講解pureMVC
GameManager.cs
MyFacede.cs
// pureMVC入口文件 using UnityEngine; using PureMVC.Patterns.Facade; // 繼承Facede public class MyFacade : Facade {public MyFacade(GameObject root){// 注冊Controller CommandRegisterCommand("REG_ADD", () =>{return new MyDataCommandAdd();});// 注冊View MediatorRegisterMediator(new MyDataMediator(root));// 注冊Model ProxyRegisterProxy(new MyDataProxy());} }Model層
// MyData.cs 數據文件 public class MyData {public int value; } // MyDataProxy.cs 代理文件 using PureMVC.Patterns.Proxy; // 繼承Proxy public class MyDataProxy : Proxy {// name 必須public const string proxyName = "MYDATAPROXY";public MyData mydata = null;// 構造 實例化數據public MyDataProxy() : base(proxyName){mydata = new MyData();}// add方法,發送"MSG_ADD"消息public void AddValue(){mydata.value++;SendNotification("MSG_ADD", mydata);}public override void SendNotification(string notificationName, object body = null, string type = null){base.SendNotification(notificationName, body, type);} }View層
// MyDataMediator.cs 中介者文件 using UnityEngine; using PureMVC.Patterns.Mediator; using UnityEngine.UI; using PureMVC.Interfaces; // 繼承Mediator public class MyDataMediator : Mediator {// name 必須public const string mediatorName = "Mediator";public Text textNum;public Button add;public Button sub;public MyDataMediator(GameObject root) : base (mediatorName){// 通過Find獲取視圖引用textNum = root.transform.Find("Text").GetComponent<Text>();add = root.transform.Find("Add").GetComponent<Button>();sub = root.transform.Find("Sub").GetComponent<Button>();// 添加事件add.onClick.AddListener(AddBtnClick);sub.onClick.AddListener(SubBtnClick);}// 接收消息列表 必須public override string[] ListNotificationInterests(){string[] list = new string[] { "MSG_ADD" };return list;}/// 消息處理 必須public override void HandleNotification(INotification notification){switch(notification.Name){case "MSG_ADD":Display(notification.Body as MyData);break;default:break;}}public void Display(MyData myData){textNum.text = myData.value.ToString();}public void AddBtnClick(){SendNotification("REG_ADD");}public override void SendNotification(string notificationName, object body = null, string type = null){base.SendNotification(notificationName, body, type);} }Controller層
// MyDataCommandAdd.cs 命令文件 using PureMVC.Patterns.Command; using PureMVC.Interfaces; // 繼承SimpleCommand public class MyDataCommandAdd : SimpleCommand {// 重寫 Executepublic override void Execute(INotification notification){// RetrieveProxy 調用add方法MyDataProxy myDataProxy = Facade.RetrieveProxy("MYDATAPROXY") as MyDataProxy;myDataProxy.AddValue();} }流程理解
個人理解
pureMVC突出一個"中介"的思想,通過設計模式對MVC框架進行了解耦,Facade 外觀模式、Proxy 代理模式、Mediator 中介者模式、Command 命令模式,pureMVC的消息機制通過觀察者模式實現。基于這些設計,以此凸顯pure的概念。
總結
以上是生活随笔為你收集整理的PureMVC在Unity游戏开发中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决MySQL数据库中文模糊检索问题
- 下一篇: html 经常会用到的英语名词