Unity PureMvc的简单使用

在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) 视图层 (更新数据显示)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值