在Unity使用PureMVC

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 initialization
	void Start () {
        //启动PureMvc框架
       AppFacade facade = new AppFacade(this.gameObject);
	}
	
	// Update is called once per frame
	void 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();
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity中实现MVC(Model-View-Controller)通常需要以下步骤: 1. 创建模型(Model):在Unity中,模型通常是指游戏对象及其组件,例如,一个角色、一个道具等。为每个模型创建一个脚本,该脚本包含模型的数据和操作方法。 2. 创建视图(View):视图是指模型的可视化表示,例如,游戏场景、UI界面等。在Unity中,可以使用Prefab和场景来创建视图。视图通常会访问模型的数据,但不会直接修改它。 3. 创建控制器(Controller):控制器是模型和视图之间的中介者,它负责处理用户输入、更新模型数据以及更新视图。在Unity中,可以为每个游戏对象或UI元素创建一个控制器脚本,该脚本包含响应用户输入的方法以及更新模型和视图的方法。 4. 将模型、视图和控制器连接起来:在Unity中,可以使用事件或委托来实现模型、视图和控制器之间的通信。例如,当用户点击一个按钮时,控制器会调用模型的方法来更新数据,并调用视图的方法来更新UI界面。 5. 维护数据的一致性:在MVC模式中,数据的一致性非常重要。因此,在Unity中实现MVC时,需要确保模型、视图和控制器之间的数据同步。例如,当模型数据发生变化时,需要及时更新视图和控制器中的相应数据。 以上是在Unity中实现MVC的一般步骤,具体实现方式可以根据项目需求和开发团队的实际情况来进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值