在Unity场景里 新建一个Text,Text_SisPlayNum,在新建一个按钮ButtonCount 。
//数据实体类(没有继承)
//功能:存储原始数据 ,属于 “模型层”
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyData {
private int _level = 0;
//玩家等级
public int Level
{
get { return _level; }
set { _level = value; }
}
}
//数据代理类 (继承Proxy)
//功能:数据的操作 ,属于 “模型层”
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PureMVC.Patterns;
public class DataProxy : Proxy {
//声明本类的名称
//new 覆盖了父类也有NAME属性
public new const string NAME = "DataProxy";
//引用实体类
private MyData _MyData;
//构造函数
public DataProxy():base(NAME)
{
_MyData = new MyData();
}
/// <summary>
/// 增加玩家的等级
/// </summary>
/// <param name="addNumber">增加的数量</param>
public void AddLevel(int addNumber)
{
//把参数累加到 “实体类” 中
_MyData.Level += addNumber;
//把变化的数据发送给视图层
SendNotification("Msg_AddLevel", _MyData);//参数: 消息名称,消息内容
}
}
//视图展示
// 显示玩家UI页面, 属于“视图层”
using PureMVC.Interfaces;
using PureMVC.Patterns;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class DataMediator : Mediator {
//定义本类名称
public new const string NAME = "DataMediator";
//定义两个显示控件
private Text TxtLevel; //显示等级
private Button BtnDisplayNumber; //点击的按钮
/// <summary>
/// 构造函数
/// </summary>
/// <param name="goRoodNode">界面UI的根结点</param>
public DataMediator(GameObject goRoodNode)
{
//确定控件
TxtLevel = goRoodNode.transform.Find("Text_SisPlayNum").gameObject.GetComponent<Text>();
BtnDisplayNumber = goRoodNode.transform.Find("ButtonCount").gameObject.GetComponent<Button>();
//注册按钮
BtnDisplayNumber.onClick.AddListener(OnClickAddingLevelNumber);
}
//用户点击事件
private void OnClickAddingLevelNumber()
{
//定义一个消息,然后发送给“控制层” , 控制层(DataCommand)的Execute会自动执行
SendNotification("Reg_StartDataCommand");
}
//本视图层,设置允许接收的消息集合
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;
default:
break;
}
}
}
//数据控制类
// 属于 “控制层”,接收玩家输入(或者视图层发来的消息),进行处理
using PureMVC.Interfaces;
using PureMVC.Patterns;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DataCommand : SimpleCommand {
//DataMediator.OnClickAddingLevelNumber 按钮事件发消息
/// <summary>
/// 视图层发送消息,这里会执行方法
/// </summary>
/// <param name="notification"></param>
public override void Execute(INotification notification)
{
// switch (notification.Name)
// {
// case "Reg_StartDataCommand":
//视图层发消息过来的时候,
//调用数据层的“增加等级”的方法
//RetrieveProxy 查找代理类
DataProxy datapro = (DataProxy)Facade.RetrieveProxy(DataProxy.NAME);
datapro.AddLevel(10);
// break;
// default:
// break;
// }
}
}
//PMVC 项目控制类(全局管理类)
using PureMVC.Patterns;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ApplicationFacade : Facade {
/// <summary>
/// 构造函数
/// </summary>
/// <param name="goRootNode"></param>
public ApplicationFacade(GameObject goRootNode)
{
//MVC 三层的关联绑定,建立绑定
//控制层注册("命令消息"与控制层类的对应关系)
//其他层发送消息 Reg_StartDataCommand ,就能执行命令层里面的Execute方法
//一个命令消息 对应 一个Commad类(继承SimpleCommand)
RegisterCommand("Reg_StartDataCommand", typeof(DataCommand));
//视图层注册
RegisterMediator(new DataMediator(goRootNode));
//模型层注册
RegisterProxy(new DataProxy());
}
}
StartGame放在Canvas上, 启动PureMvc框架
//游戏的开始
//游戏项目的入口
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StartGame : MonoBehaviour {
// Use this for initialization
void Start () {
//启动PureMVC框架
//this.gameObject 是UI界面的根结点
new ApplicationFacade(this.gameObject);
}
}
PureMVC架构中存在两种不同类型的消息:“命令绑定”类型消息 和 “通讯消息”。
当按钮被按下的时候,视图层(DataMediator)里的 按钮绑定事件 发送消息给 控制层(DataCommand)来
处理玩家输入(或者视图层发来的消息),控制层会根据“命令”消息 [Reg_StartDataCommand] 绑定的对应类 [DataCommand],来自动调用类里面的Execute 方法,然后查找 数据代理(操作)类 (模型层 ),获得数据操作类对象,调用其数据操作函数来对数据操作,数据操作类(模型层 )发送“通讯消息”[Msg_AddLevel] 给视图层,视图层收到消息通过HandleNotification方法
来更新UI数据 【TxtLevel.text 】。
PureMvc 流程
视图层 命令绑定通知(SendNotification) 控制层
控制层 方法调用(Facade.RetrieveProxy()) 模型层 (对数据修改)
模型层 消息通知(SendNotification) 视图层 (更新数据显示)