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
// 任意文件
using UnityEngine;
// 继承mon
public class GameManager : MonoBehaviour
{void Start(){// 实例化FacadeMyFacade myFacade = new MyFacade(gameObject);}
}
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();}
}
流程理解
- 当点击View界面的Button后,由Mediator开始处理,通过pureMVC提供的SendNotification方法通知Controller
- Controller接收到消息后,由相应的"REG_ADD"命令(Command)进行处理,调用Facade的RetrieveProxy方法访问数据
- Model数据由Proxy代为管理,当数据发生变化后由Proxy通过SendNotification通知View改变视图。
个人理解
pureMVC突出一个"中介"的思想,通过设计模式对MVC框架进行了解耦,Facade 外观模式、Proxy 代理模式、Mediator 中介者模式、Command 命令模式,pureMVC的消息机制通过观察者模式实现。基于这些设计,以此凸显pure的概念。
PureMVC在Unity游戏开发中的应用相关推荐
- Unity游戏开发中的向量运算-点乘和叉乘
Unity游戏开发中的向量运算-点乘和叉乘 1.点乘: 定义: 又称点积.数量积.标量积.既可以由向量坐标的代数运算得出,也可以通过引入两个向量的长度和角度等几何概念来求解. 公式一: 公式二: 点积 ...
- Unity游戏开发中ECS思想介绍
ECS是啥? ECS是一种编程思想,和传统的面向对象有区别 有一篇文章说的挺好,大家可以看看,这里只简要概括一下! 浅谈<守望先锋>中的ECS架构 ECS: E(Entity)实体 C(C ...
- Unity游戏开发中的内存管理_资料
http://mp.weixin.qq.com/mp/homepage?__biz=MzAwMTUzOTczNQ==&hid=6&sn=44228b7260d7a5a3287a4499 ...
- Unity游戏开发之游戏存档方式
目录 1.Unity自带存储方式PlayerPrefs 2.XML存储方式 3.Json类型存储方式 1.Unity的序列化问题 2.Unity中支持序列化的类 3.Unity中Json的使用方法 4 ...
- unity 角度限制_喵的Unity游戏开发之路 推球:游戏中的物理
前言很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本 ...
- Unity游戏开发——Excel数据读取到游戏中
C# Unity游戏开发--Excel中的数据是如何到游戏中的 (一) 引言 现在做游戏开发的没有几个不用Excel的,用的最多的就是策划.尤其是数值策划,Excel为用户提供强大的工具,各种快捷键, ...
- 喵的Unity游戏开发之路 - 推球:游戏中的物理
很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...
- Unity 3D - 游戏开发中的Lua
Unity 3D - 游戏开发中的Lua : 本文作者:秦元培, 本文出处:http://blog.csdn.net/qinyuanpei/article/details/39826323 前言 : ...
- [Unity游戏开发]向量在游戏开发中的应用(一)
本文已同步发表在博客园:http://www.cnblogs.com/davidsheh/p/5246213.html ---------------------------------------- ...
最新文章
- springBean生命周期----来自spring实战总结
- WINCE6.0添加对viewrs(PDF,Word,Execel和PowerPoint)支持
- python中的及||
- Java IO学习--(五)字节和字符数组
- 实现中文下的UITableView Index
- C++11 后置返回类型
- CPCL简易打印模板设计
- 微信广告数据源创建查询与上报-PHP
- 好用的 Mac 应用程序、软件和工具
- 计算机论文投tmc期刊,无线网络会议与期刊档次划分一览
- javafx 教程_JavaFX,Jigsaw项目和JEP 253
- 管理者,最重要的100句话
- 国内新锐买手品牌BSiEE 本涩启动第三届品牌代言人招募活动
- 西门子在华启动“零碳先锋计划”;希尔顿欢朋在华项目签约数突破600 | 美通社头条...
- Lammps实现水分子在纳米颗粒球表面的吸附行为
- 实测 11 款远程视频会议软件,宅家工作也能如丝般顺滑
- 大数据学习笔记(六)HDFS-API
- “保险+大数据” 车险费改怎么玩?
- L3-008 喊山 (30 分)(bfs)
- Jmeter tcp压测实践
热门文章
- android mp4语音识别,怎样用语音识别将一段视频转化为文字, 比如:百度的语音识别api...
- mysql的unique_MySQL使用UNIQUE实现数据不重复插入
- 用单片机测量流体流速的_金属管转子流量计基本测量原理
- php 500 yii,yii2.0出现500错误怎么办
- 递归算法1加到100_五种循环方法计算1加到100
- Initialization failed for ‘https://start.spring.io‘ Please check URL, network and proxy settings.
- 计算机管理也无法运行,【两种解决方法】任务管理器打不开怎么办?
- 从一个点云里面创建一个深度图
- 2019无盘游戏服务器128g内存,云更新无盘客户端 v2019.8.15.12486官方版
- 安装rtx时报错因计算机中丢失lo,policy.3.1.IntervalZero.RTX64.dll