作为开发人员,我们都想写出优雅的代码,可又苦于自身能力不知该如何下手,而框架的作用正在与能够让你规范的去开发。

之前写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();}
}

流程理解

  1. 当点击View界面的Button后,由Mediator开始处理,通过pureMVC提供的SendNotification方法通知Controller
  2. Controller接收到消息后,由相应的"REG_ADD"命令(Command)进行处理,调用Facade的RetrieveProxy方法访问数据
  3. Model数据由Proxy代为管理,当数据发生变化后由Proxy通过SendNotification通知View改变视图。

个人理解

pureMVC突出一个"中介"的思想,通过设计模式对MVC框架进行了解耦,Facade 外观模式、Proxy 代理模式、Mediator 中介者模式、Command 命令模式,pureMVC的消息机制通过观察者模式实现。基于这些设计,以此凸显pure的概念。

PureMVC在Unity游戏开发中的应用相关推荐

  1. Unity游戏开发中的向量运算-点乘和叉乘

    Unity游戏开发中的向量运算-点乘和叉乘 1.点乘: 定义: 又称点积.数量积.标量积.既可以由向量坐标的代数运算得出,也可以通过引入两个向量的长度和角度等几何概念来求解. 公式一: 公式二: 点积 ...

  2. Unity游戏开发中ECS思想介绍

    ECS是啥? ECS是一种编程思想,和传统的面向对象有区别 有一篇文章说的挺好,大家可以看看,这里只简要概括一下! 浅谈<守望先锋>中的ECS架构 ECS: E(Entity)实体 C(C ...

  3. Unity游戏开发中的内存管理_资料

    http://mp.weixin.qq.com/mp/homepage?__biz=MzAwMTUzOTczNQ==&hid=6&sn=44228b7260d7a5a3287a4499 ...

  4. Unity游戏开发之游戏存档方式

    目录 1.Unity自带存储方式PlayerPrefs 2.XML存储方式 3.Json类型存储方式 1.Unity的序列化问题 2.Unity中支持序列化的类 3.Unity中Json的使用方法 4 ...

  5. unity 角度限制_喵的Unity游戏开发之路 推球:游戏中的物理

    前言很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本 ...

  6. Unity游戏开发——Excel数据读取到游戏中

    C# Unity游戏开发--Excel中的数据是如何到游戏中的 (一) 引言 现在做游戏开发的没有几个不用Excel的,用的最多的就是策划.尤其是数值策划,Excel为用户提供强大的工具,各种快捷键, ...

  7. 喵的Unity游戏开发之路 - 推球:游戏中的物理

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

  8. Unity 3D - 游戏开发中的Lua

    Unity 3D - 游戏开发中的Lua : 本文作者:秦元培, 本文出处:http://blog.csdn.net/qinyuanpei/article/details/39826323 前言 : ...

  9. [Unity游戏开发]向量在游戏开发中的应用(一)

    本文已同步发表在博客园:http://www.cnblogs.com/davidsheh/p/5246213.html ---------------------------------------- ...

最新文章

  1. springBean生命周期----来自spring实战总结
  2. WINCE6.0添加对viewrs(PDF,Word,Execel和PowerPoint)支持
  3. python中的及||
  4. Java IO学习--(五)字节和字符数组
  5. 实现中文下的UITableView Index
  6. C++11 后置返回类型
  7. CPCL简易打印模板设计
  8. 微信广告数据源创建查询与上报-PHP
  9. 好用的 Mac 应用程序、软件和工具
  10. 计算机论文投tmc期刊,无线网络会议与期刊档次划分一览
  11. javafx 教程_JavaFX,Jigsaw项目和JEP 253
  12. 管理者,最重要的100句话
  13. 国内新锐买手品牌BSiEE 本涩启动第三届品牌代言人招募活动
  14. 西门子在华启动“零碳先锋计划”;希尔顿欢朋在华项目签约数突破600 | 美通社头条...
  15. Lammps实现水分子在纳米颗粒球表面的吸附行为
  16. 实测 11 款远程视频会议软件,宅家工作也能如丝般顺滑
  17. 大数据学习笔记(六)HDFS-API
  18. “保险+大数据” 车险费改怎么玩?
  19. L3-008 喊山 (30 分)(bfs)
  20. Jmeter tcp压测实践

热门文章

  1. android mp4语音识别,怎样用语音识别将一段视频转化为文字, 比如:百度的语音识别api...
  2. mysql的unique_MySQL使用UNIQUE实现数据不重复插入
  3. 用单片机测量流体流速的_金属管转子流量计基本测量原理
  4. php 500 yii,yii2.0出现500错误怎么办
  5. 递归算法1加到100_五种循环方法计算1加到100
  6. Initialization failed for ‘https://start.spring.io‘ Please check URL, network and proxy settings.
  7. 计算机管理也无法运行,【两种解决方法】任务管理器打不开怎么办?
  8. 从一个点云里面创建一个深度图
  9. 2019无盘游戏服务器128g内存,云更新无盘客户端 v2019.8.15.12486官方版
  10. 安装rtx时报错因计算机中丢失lo,policy.3.1.IntervalZero.RTX64.dll