1.动机

由于在topameng的cstolua框架中使用到了PureMVC框架,本人初学热更新时便感到了一头雾水,因此又特地的了解学习了PureMVC框架。

2.导入PureMVC框架

首先要说一些PureMVC的来历,这是一个开源框架最初只是用于as3语言,但是现在已经几乎移植到所有的发展平台,分为单核和多核,我们要使用的是客户端所使用的单核。这里提供一个现成的下载地址,下载后直接拖入unity工程目录下就可以使用。

3.流程


Command接受玩家的输入(或者视图层发来的输入消息)
---------------------响应方法,调用命令对应的代理模型(这里属于查找调用关系)--------------------->
Proxy数据代理类,负责模型曾数据的操作(使用数据代理类同时也保证了Model层的移植性)
-------------------------代理类中数据做出相应改变,并且发送消息通知Command或Mediator------------------------------>
Mediator视图展示(监听到Proxy发送的消息Mediator做出相对应的UI界面改变)

4.主要实现步骤

1.首先定义数据类与“数据代理类”。
消息传递:当数据增加时,发送“消息”到视图层。
2.然后定义视图类
消息传递:
A)当注册的试图层按钮被点击时,发送“消息”到控制层。
B)定义本视图类,允许接受的消息名称集合,以及对应的处理。
3.定义控制类
调用模型层:通过框架的RetrieveProxy()方法,执行调用模型层的"等级增加"方法
4。通过PureMVC框架注册方法(RegisterXXX)把MVC的三个层进行关联绑定
特别注意点:
1.控制层在注册时候,需要定义“命令消息”与对应的控制层类
2.“命令消息”与普通的“消息”不是一回事,注意区分这列的"命令消息"类似于绑定
5.定义入口类,在Unity中调试运行PureMVC

5.代码实现

1.数据实体类与属于代理类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 数据实体类
///
/// </summary>
public class MyData {private int _Level =0;public int Level{get { return _Level; }set { _Level = value; }}
}
using PureMVC.Patterns;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 数据代理类
/// 功能:模型层 数据的操作
/// </summary>
public class DataProxy : Proxy {/// <summary>/// 声明本类的名称/// </summary>public new const string NAME = "DataProxy";/// <summary>/// 引用“实体类”/// </summary>private MyData _MyData = null;/// <summary>/// 构造器/// </summary>public DataProxy():base(NAME){_MyData = new MyData();}/// <summary>/// 增加玩家等级/// </summary>public void AddLevel(int addNumber){//把参数累加到“实体类中”_MyData.Level += addNumber;//把变化了的数据,发送给“视图层”SendNotification("Msg_AddLevel", _MyData);}
}

2.定义视图类

using PureMVC.Patterns;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using PureMVC.Interfaces;
/// <summary>
/// 视图展示
/// 功能:属于“视图层”显示玩家ui页面
/// </summary>
public class DataMediator : Mediator {//定义本类的名称public new const string NAME = "DataMediator";//定义控件private Text TxtLevel;private Button BtnDisplayLevelNum;public DataMediator(GameObject goRootNode){//确定控件TxtLevel = goRootNode.transform.Find("Text").GetComponent<Text>();BtnDisplayLevelNum = goRootNode.transform.Find("BtnCount").GetComponent<Button>();BtnDisplayLevelNum.onClick.AddListener(OnClickAddLevel);}/// <summary>/// 定义一个点击事件/// </summary>private void OnClickAddLevel(){//定义消息,发送“控制层”SendNotification("Reg_StartDataCommand");}/// <summary>/// 本视图层允许接受的消息/// </summary>/// <returns></returns>public override IList<string> ListNotificationInterests(){IList<string> listResult = new List<string>();//可以接受的消息(集合)listResult.Add("Msg_AddLevel");return listResult;}/// <summary>/// 处理所有其他类,发给本类允许处理的消息/// </summary> /// <param name="notification"></param>public override void HandleNotification(INotification notification){switch (notification.Name){case "Msg_AddLevel"://把模型层发来的数据显示给控件MyData myData = notification.Body as MyData;TxtLevel.text = myData.Level.ToString();break;}}
}

3.定义控制类

using PureMVC.Patterns;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PureMVC.Interfaces;
/// <summary>
/// 数据控制类
/// 功能:属于“控制层”,接收玩家的输入(或者视图层发来的输入消息),进行处理
/// </summary>
public class DataCommand : SimpleCommand {/// <summary>/// 执行方法/// </summary>/// <param name="notification"></param>public override void Execute(INotification notification){//调用数据层的“增加等级”的方法DataProxy datapro = (DataProxy)Facade.RetrieveProxy(DataProxy.NAME); //检索到从Facade注册的代理类,datapro.AddLevel(10);}}

4.PureMVC全局控制类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PureMVC.Patterns;
/// <summary>
/// PureMVC项目全局控制类
/// </summary>
public class AppFacade : Facade {/// <summary>/// 构造函数/// </summary>/// <param name="goRoot">UI界面的根节点</param>public AppFacade(GameObject goRoot){/*MVC三层的关联绑定*///控制层注册("命令消息"与控制层类的对应关系建立绑定)(当发送Reg_StartDataCommand消息时执行DataCommand)RegisterCommand("Reg_StartDataCommand", typeof(DataCommand));//视图层注册RegisterMediator(new DataMediator(goRoot));//模型层注册RegisterProxy(new DataProxy());}
}

5.定义入口调用启动

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class StartGame : MonoBehaviour {// Use this for initializationvoid Start () {//启动PureMvc框架AppFacade facade = new AppFacade(this.gameObject);}// Update is called once per framevoid Update () {}
}

代码运行流程:

在StartGame中我们启动构造了框架,在AppFacade中对MVC三层关系进行了绑定,如果没有对这几个类进行注册那么,MVC三层之间是没有任何联系的,这里Facade的作用就是对三层做了关联,当用户点击了按钮,Mediator中的Button就会响应OnClickAddLevel回调,此时将会发送消息给控制层,对应的Command中做出对应响应,调用从AppFacade注册的Proxy代理类中的相应方法,此时数据代理类中吧变化了的数据发送给视图层Mediator,这时监听了该消息的视图层就会做出相应的改变。
PureMVC框架与脚本相互通讯机理
1.框架内部交互:
SendNotification();
2.框架外部与框架交互:
Facade.Instance.SendNotification();
3.框架内部与外部调用“层实例”的不同
Facade.RetrieveProxy();
Facade.RetrieverMediator();
PureMVC的一些主要方法
这篇博客的工程源码

在Unity使用PureMVC相关推荐

  1. Unity - 对PureMVC的理解和应用

    #Unity - PureMVC的理解和应用 PureMVC顾名思义,比MVC更纯净的MVC架构,相比与MVC它耦合性更低.代码重用性更高,当然缺点也比较明显:事件的传递都要经过拆箱装箱.事件的执行都 ...

  2. 【unity】 PureMvc 入门尝试小案例

    目录 目录 1:写pureMvc第一步需要做什么? 2:业务执行顺序是什么? 3:主要代码 3.1:数据部分(Proxy) 3.1.1:原始数据面板中text显示的value 3.1.2:proxy类 ...

  3. 20170916导出fuck 7654导航

    Bookmarks 书签栏 unity Unity游戏开发有哪些让你拍案叫绝的技巧? [Unity3D学习 愤怒的小鸟攻略技巧秘籍 unity3d技巧 unity3d愤怒的小鸟实现 unity3d切换 ...

  4. PureMVC在Unity游戏开发中的应用

    作为开发人员,我们都想写出优雅的代码,可又苦于自身能力不知该如何下手,而框架的作用正在与能够让你规范的去开发. 之前写Web的时候,总被要求采用MVC架构,的确非常好用,也从来没有质疑过这种架构的好与 ...

  5. [Unity]PureMVC框架解读(上)

    PureMVC框架解读 简易UI框架 1.UI框架核心方法 BaseUI会记录UI的名字(枚举)和Controller用来将UI与具体操作方法解耦 UIManger利用字典记录所有的UI组件,然后提供 ...

  6. Unity PureMVC框架案例

    引言 PureMVC框架解读上:https://blog.csdn.net/qq_29579137/article/details/73692842 PureMVC框架解读下:https://blog ...

  7. Unity实战(3):pureMVC框架应用

    目录 前言 一.下载框架并编译生成dll文件 二.Unity搭建基本要素 三.pureMVC简要说明 四.pureMVC脚本编写 4.1 MyData脚本 4.2 MyDataProxy脚本 4.3 ...

  8. 视频教程-Unity客户端框架设计PureMVC篇视频课程(上)-Unity3D

    Unity客户端框架设计PureMVC篇视频课程(上) 二十多年的软件开发与教学经验IT技术布道者,资深软件工程师.具备深厚编程语言经验,在国内上市企业做项目经理.研发经理,熟悉企业大型软件运作管理过 ...

  9. 视频教程-Unity客户端框架设计PureMVC篇视频课程(下)-Unity3D

    Unity客户端框架设计PureMVC篇视频课程(下) 二十多年的软件开发与教学经验IT技术布道者,资深软件工程师.具备深厚编程语言经验,在国内上市企业做项目经理.研发经理,熟悉企业大型软件运作管理过 ...

最新文章

  1. 漫话:如何给女朋友解释什么是单例模式?
  2. LockSupport 使用
  3. 重磅 |“金砖”电商报告:5年后金砖五国网络零售将超3万亿美元
  4. 【重复制造精讲】Backflush 倒冲介绍
  5. Oracle数据库迁移后变慢,迁移数据之后,读取数据库变得很慢
  6. iOS物理碰撞、唱吧音频处理、仿淘宝联动效果等源码
  7. python第k序列元素查找_Python寻找第k小的元素
  8. html 星空效果,html5 canvas炫酷旋转银河系星空背景特效
  9. Caffe(13)--(SSRNet模型)Keras转Caffe教程
  10. [转] 史上最全英文免费编程电子书列表
  11. 强大好看的dz论坛社区源码手机端
  12. 完美安装运行Xcelsius 2008 SP3解决方案
  13. 02 | 领域、子域、核心域、通用域和支撑域
  14. 基于小波分解与LSTM的城市轨道短时客流预测
  15. Winform从入门到精通(41)——FileSystemWatcher(史上最全)
  16. 微软拥抱ChatGPT后,我亲自试了试新必应的个性搜索
  17. EasyExcel 中文文档
  18. 在线计算机词典,精编英汉计算机词典.pdf
  19. PHP--根据手机号-淘宝平台获取归属地运营商信息
  20. liunx服务器配置

热门文章

  1. RabbitMQ搭建集群时异常
  2. 前端构建工具是什么?
  3. 前端自动化构建工具介绍
  4. iOS与Android对比
  5. h5 or web缅甸语乱码问题
  6. h3csyslog_H3C syslog配置 -
  7. DenseNet(Densely Connected Convolutional Networks)学习笔记
  8. 竣达技术丨智能精密空调网络监控终端的功能及技术特性
  9. Oracle公有云上的ADG配置(单实例)
  10. Java学习总结——类和对象