1.动机
由于在topameng的cstolua框架中使用到了PureMVC框架,本人初学热更新时便感到了一头雾水,因此又特地的了解学习了PureMVC框架。
2.导入PureMVC框架
首先要说一些PureMVC的来历,这是一个开源框架最初只是用于as3语言,但是现在已经几乎移植到所有的发展平台,分为单核和多核,我们要使用的是客户端所使用的单核。这里提供一个现成的下载地址,下载后直接拖入unity工程目录下就可以使用。
3.流程
Command接受玩家的输入(或者视图层发来的输入消息)
———————响应方法,调用命令对应的代理模型(这里属于查找调用关系)———————>
Proxy数据代理类,负责模型曾数据的操作(使用数据代理类同时也保证了Model层的移植性)
————————-代理类中数据做出相应改变,并且发送消息通知Command或Mediator——————————>
Mediator视图展示(监听到Proxy发送的消息Mediator做出相对应的UI界面改变)
4.主要实现步骤
5.代码实现
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 initialization
void Start () {
//启动PureMvc框架
AppFacade facade = new AppFacade(this.gameObject);
}
// Update is called once per frame
void Update () {
}
}
代码运行流程:
今天的文章在Unity使用PureMVC分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/9842.html