目录

前言

一、下载框架并编译生成dll文件

二、Unity搭建基本要素

三、pureMVC简要说明

四、pureMVC脚本编写

4.1 MyData脚本

4.2 MyDataProxy脚本

4.3 MyMediator脚本

4.4  MyCommandSub和MyCommandAdd脚本

4.5 MyFacade脚本

4.6 GManager脚本

五、运行效果

六、小结

七、参考资料


前言

在做实际项目的时候想做低耦合的代码,将程序各部分拆分,故使用了pureMVC框架。在查找资料的时候发现现有资料版本过低,有些部分有更改,因此写本文记录一下整个操作过程。

一、下载框架并编译生成dll文件

1.1 登录pureMVC.org,点击C#跳转至github下载

1.2 点击 code

此时需要注意默认跳转的是multicore版本,属于多线程,暂时不需要使用这个,所以点击跳转至上一级页面重新选择

1.3 点击 repositories,选择puremvc-csharp-standard-framework下载并解压

包含以下几个文件:

1.4 选择PureMVC.sln文件使用VS打开(我使用的是VS2019版本)

PureMVC右键点击“属性”,在目标框架中选择.NET Core 2.0

(这里有一个疑问,默认打开时是.NET 5.0,这个框架编译后导入Unity使用时会报错,使用core 2.0编译使用亲测可行)

在PureMVC上右键点击“生成”,等待编译完成 。完成后dll文件会在这里:

至此dll文件编译完成,下一步是将其导入Unity调用。

二、Unity搭建基本要素

根据B站上找到的教程:

PureMVC框架的使用方法_哔哩哔哩_bilibiliPureMVC框架的使用方法共计9条视频,包括:01什么是PureMVC、02源码的下载、编译、导入Unity、03PureMVC的基础理论等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV1K4411G7Jr/?spm_id_from=333.337.search-card.all.click

搭建测试demo

2.1 导入pureMVC.dll

在新文件下创建以下文件夹:

将dll文件直接拖到Plugins下

2.2 在窗口新建以下控件

一个名为Add的按钮,一个名为Sub的按钮,一个名为txtValue的TextMeshPro

(说明:原版教程中使用的均为Text组件,在新版Unity中已经很少使用,因此本次demo中使用的均为TextMeshPro(TMP))

呈现效果如下:

以上准备工作已完成,下一步为脚本编写

三、pureMVC简要说明

这里记录一下本人对pureMVC框架的简单理解。

pureMVC框架是一种多脚本代码的组织形式,使用的目的在于“解耦”。

(官网架构图)

  • Model 与 Proxy
    Model保存对Proxy对象的引用,Proxy负责操作数据模型,存取数据。这样保证了Model层的可移植性。
  • View 与 Mediator
    View保存对Mediator对象的引用。由Mediator对象来操作具体的视图组件(View Component),包括:添加事件监听器,发送或接收Notification ,直接改变视图组件的状态。这样做实现了把视图和控制它的逻辑分离开来。
  • Controller 与 Command
    Controller保存所有Command的映射。Command类是无状态的,只在需要时才被创建。
    Command可以获取Proxy对象并与之交互,发送Notification,执行其他的Command。经常用于复杂的或系统范围的操作,如应用程序的“启动”和“关闭”。应用程序的业务逻辑应该在这里实现。
  • Facade 与 Model,View和Controller
    Facade类应用单例模式,它负责初始化核心层(Model,View和Controller),并能访问它们的Public方法。在实际的应用中,只需继承Facade类创建一个具体的Facade类就可以实现整个MVC模式,并不需要在代码中导入编写Model,View和Controller类。
    Proxy、Mediator和Command就可以通过创建的Facade类来相互访问通信。
  • (消息类型)

四、pureMVC脚本编写

4.1 MyData脚本

这里创建需要操作的核心变量

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MyData
{public int dataValue;
}

4.2 MyDataProxy脚本

可以理解为对dataValue的代理并操作

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PureMVC.Patterns.Proxy;public class MyDataProxy : Proxy
{public const string proxyName = "MyData01";public MyData myData = null;public MyDataProxy() : base(proxyName) {myData = new MyData();}public void addValue() {myData.dataValue++;SendNotification("msg_add", myData);}public void subValue() {myData.dataValue--;SendNotification("msg_sub", myData);}
}

4.3 MyMediator脚本

最关键的操作部分都写在这里。由于Text组件在最新Unity中几乎弃用,因此这里改用了TMP。需要注意的是,TMP的文字在程序化修改时需要使用<TMP_Text>组件获取。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PureMVC.Patterns.Mediator;
using UnityEngine.UI;
using PureMVC.Interfaces;
using TMPro;public class MyMediator : Mediator
{public const string mediatorName = "myMediator";//public Text txtNumber;public TMP_Text txtNum;public Button btnAdd;public Button btnSub;public MyMediator(GameObject root) : base(mediatorName) {//txtNumber = root.transform.Find("txtValue").GetComponent<Text>();txtNum = root.transform.Find("txtValue").GetComponent<TMP_Text>();btnAdd = root.transform.Find("Add").GetComponent<Button>();btnSub = root.transform.Find("Sub").GetComponent<Button>();btnAdd.onClick.AddListener(addBtn);btnSub.onClick.AddListener(subBtn);}/// <summary>/// 接受什么消息/// </summary>public override string[] ListNotificationInterests() {string[] list = new string[2];list[0] = "msg_add";list[1] = "msg_sub";return list;}/// <summary>/// 得到消息后执行什么/// </summary>/// <param name="notification"></param>public override void HandleNotification(INotification notification) {Debug.Log(notification.Name);switch (notification.Name) {case "msg_add":display(notification.Body as MyData);break;case "msg_sub":display(notification.Body as MyData);break;default:break;}}public void display(MyData myData) {//txtNumber.text = myData.dataValue.ToString();txtNum.text = myData.dataValue.ToString();}public void addBtn() {SendNotification("cmd_add");}public void subBtn() {SendNotification("cmd_sub");}
}

4.4  MyCommandSub和MyCommandAdd脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PureMVC.Patterns.Command;
using PureMVC.Interfaces;public class MyCommandSub : SimpleCommand
{public override void Execute(INotification notification) {MyDataProxy myDataProxy = Facade.RetrieveProxy("MyData01") as MyDataProxy;myDataProxy.subValue();}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PureMVC.Patterns.Command;
using PureMVC.Interfaces;public class MyCommandAdd : SimpleCommand
{public override void Execute(INotification notification) {MyDataProxy myDataProxy = Facade.RetrieveProxy("MyData01") as MyDataProxy;myDataProxy.addValue();}
}

4.5 MyFacade脚本

这里用于注册各命令、代理、中介等

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PureMVC.Patterns.Facade;public class MyFacade : Facade
{public MyFacade(GameObject root) : base() {RegisterCommand("cmd_add", () => { return new MyCommandAdd(); });RegisterCommand("cmd_sub", () => { return new MyCommandSub(); });RegisterMediator(new MyMediator(root));RegisterProxy(new MyDataProxy());}
}

4.6 GManager脚本

给整个框架赋上物体,这里要把这个脚本挂在Unity的Canvas上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GManager : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){MyFacade myFacade = new MyFacade(gameObject);}// Update is called once per framevoid Update(){}
}

五、运行效果

点击Add时数字会加一,点击Sub时数字会减一

六、小结

在使用pureMVC框架时,代码编写可以遵循“主体变量”—“变量代理”—“操作中介”—“指令选择”—“注册”—“物体传递”的思路进行。这种框架下,各项功能的修改只需要更改很小一部分代码即可,降低了代码修改导致风险的可能性。

七、参考资料

(1)PureMVC框架的使用方法_哔哩哔哩_bilibili

(2)PureMVC框架 - 简书

Unity实战(3):pureMVC框架应用相关推荐

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

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

  2. Unity PureMVC框架案例

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

  3. Unity PureMVC 之 PureMVC 框架的下载,以及一个简单应用学会使用 PureMVC 框架

    Unity PureMVC 之 PureMVC  框架的下载,以及一个简单应用学会使用 PureMVC  框架 目录 Unity PureMVC 之 PureMVC  框架的下载,以及一个简单应用学会 ...

  4. PureMVC框架的学习笔记

    曾经自己做的项目UI层使用简单的UI框架,发现扩展性不强,大型项目多人协同也是个问题,于是学习了比较经典的基于MVC的PureMVC以及基于MVVM的LoxodonFramework,今天记录一下有关 ...

  5. pytest测试实战 电子书_pytest实战APL测试框架

    Pytest实战API测试框架 功能规划 数据库断言 pymysql -> 封装 环境清理 数据库操作 -> Fixtures 并发执行 pytest-xdist 多进程并行 复合断言 p ...

  6. 什么是 PureMVC 框架(提供下载)

    PureMVC是在基础的经典模型.视图和控制器上建立的一个轻量级的应用框架,这种开源框架是免费的,它最初是执行的ActionScript 3语言使用的Adobe Flex.Flash和AIR,现在已经 ...

  7. winform listview 设置选中项 图片_实战PyQt5: 069-MV框架中的项视图拖放功能

    模型-视图框架完全支持Qt的基本拖放操作,列表.树形和表格部件中的项可以在视图间拖动,数据可以以MIME类型的格式进行导入和导出 Qt提供的标准视图自动支持在视图内部的拖放,其中的项可以被移动以改变显 ...

  8. openopc.opcerror: dispatch: 无效的类字符串_实战PyQt5: 064-MV框架中的Model类

    模型(Model)简介 在Model-View框架中,模型(Model)为视图(View)和委托(Delegate)使用数据提供了标准接口.大多数情况下模型中并不真正存储数据(如果只有少量的数据,可以 ...

  9. [Unity] 状态机事件流程框架 (二) 设计游戏状态的保存框架,存档功能 ScriptableObject、EasySave

    前文 : ​​​​​​​[Unity] 状态机事件流程框架 (一) 本期来设计一个游戏状态的怎么在游戏中表示和存储.保存游戏状态的目的一是方便根据玩家当前的游戏进度实行各种各样的逻辑分支,二是在存档时 ...

最新文章

  1. 高斯判别分析 Gaussian Discriminant Analysis
  2. Tornado写简易服务器
  3. JS Math对象中一些小技巧
  4. 600W个微信红包封面,人人都能领取到!!!
  5. Laravel核心解读 -- 用户认证系统(基础介绍)
  6. Unity官方宣传片Adam 播放地址
  7. HTTP之一:http协议简介(3)
  8. 几种RIA技术(富互联网应用程序)比较
  9. 查询中接受的主体参数
  10. 《自拍教程48》Python_adb随机地图移图2小时
  11. 蓝桥杯web开发-5道模拟题让你信心满满
  12. [OpenAirInterface实战-17] :OAI 软件无线电USRP N300/N310硬件详解
  13. 这一篇带你学点儿 Java8 中的流式数据处理
  14. 多用户MIMO在移动通信系统中的应用
  15. day25:组合总和,电话号码的字母组合
  16. 重启电脑后MySQL数据丢失_为什么当我重启电脑时会出现数据丢失?
  17. 反激 (Flyback) 控制器 -- LTC3803
  18. c51单片机汇编语言语法错误,关于51单片机汇编语言一些注意事项
  19. 西门子SMART LINE触摸屏以太网连接松下PLC
  20. Python—SJ—实验6—加密解密文本

热门文章

  1. ecshop源码分析——静态缓存static_c…
  2. uniapp的路由守卫
  3. ip和端口号的正则表达式
  4. 一文弄懂FlexE Mux Demux
  5. 2023年华为HCIE-Dacom认证题库(H12-891)
  6. 有没有自动打码的软件
  7. 大牌网站都在用的字体,专治选择困难症!|附字体
  8. freopen函数详解
  9. PHPStudy后门事件分析
  10. 神经网络基础视频教程下载,神经网络训练全过程