1、什么是MVVM

借用一下百度百科上对MVVM的介绍,MVVM是Model-View-ViewModel的简写,它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。

2、MVVM在unity开发中的应用

MVVM框架应用面十分广泛,通常在前端开发中应用很广,最近看到周围同事在开发WPF时用到了这个框架,抱着好奇的态度来学习一下这个框架,MVVM框架在unity开发中同样适用,在unity中,将每个UI抽象成一个个View,通常我们为每一个UI面板定义一个View,View中包含了该面板中涉及到的UI元素,比如一个Text,一个Button;每一个View都有独立的ViewModel来管理,ViewModel中提供必要的属性和方法来控制View, 而Model只是单纯的定义一个数据模型。前两天在github上发现了这个叫uMVVM的框架,拿来试用了一下,下面分析一下该框架对MVVM模式的设计。

3、uMVVM的设计与实现

下载uMVVM后,它提供了一些使用示例:

在这个示例中,有两个panel,就定义了两个view,每个view中定义该界面的元素,比如SetupView:
public class SetupView:UnityGuiView<SetupViewModel>{public InputField nameInputField;public Text nameMessageText;public InputField jobInputField;public Text jobMessageText;public InputField atkInputField;public Text atkMessageText;public Slider successRateSlider;public Text successRateMessageText;public Toggle joinToggle;public Button joinInButton;public Button waitButton;public SetupViewModel ViewModel { get { return (SetupViewModel)BindingContext; } }}

可以看到,View中需要指定对应的ViewModel来管理该View,ViewModel中定义的属性需要具备当数据改变时通知订阅者的功能,因此uMVVM对这种属性进行了一层封装,具体设计如下:
public class BindableProperty<T>{public delegate void ValueChangedHandler(T oldValue, T newValue);public ValueChangedHandler OnValueChanged;private T _value;public T Value{get{return _value;}set{if (!Equals(_value, value)){T old = _value;_value = value;ValueChanged(old, _value);}}}private void ValueChanged(T oldValue, T newValue){if (OnValueChanged != null){OnValueChanged(oldValue, newValue);}}public override string ToString(){return (Value != null ? Value.ToString() : "null");}}

可以看到,BindableProperty类中维护一个T类型数据,当T发生变化时,可以通知到订阅者,有了这种属性之后,那么ViewModel就是这样的了:
public class SetupViewModel:ViewModelBase{public readonly BindableProperty<string> Name = new BindableProperty<string>();public readonly BindableProperty<string> Job=new BindableProperty<string>(); public readonly BindableProperty<int> ATK = new BindableProperty<int>();public readonly BindableProperty<float> SuccessRate=new BindableProperty<float>(); public readonly BindableProperty<State> State=new BindableProperty<State>();
}

uMVVM的设计中,每个View都继承UnityGuiView这个泛型类,UnityGuiView大概的内容是这样:
public abstract class UnityGuiView<T>:MonoBehaviour,IView<T> where T:ViewModelBase{private bool _isInitialized;public bool destroyOnHide;protected readonly PropertyBinder<T> Binder=new PropertyBinder<T>();public readonly BindableProperty<T> ViewModelProperty = new BindableProperty<T>();public T BindingContext{get { return ViewModelProperty.Value; }set{if (!_isInitialized){OnInitialize();_isInitialized = true;}//触发OnValueChanged事件ViewModelProperty.Value = value;}}/// <summary>/// 初始化View,当BindingContext改变时执行/// </summary>protected virtual void OnInitialize(){//无所ViewModel的Value怎样变化,只对OnValueChanged事件监听(绑定)一次ViewModelProperty.OnValueChanged += OnBindingContextChanged;}/// <summary>/// 当gameObject将被销毁时,这个方法被调用/// </summary>public virtual void OnDestroy(){if (BindingContext.IsRevealed){Hide(true);}BindingContext.OnDestory();BindingContext = null;ViewModelProperty.OnValueChanged = null;}/// <summary>/// 绑定的上下文发生改变时的响应方法/// 利用反射+=/-=OnValuePropertyChanged/// </summary>public virtual void OnBindingContextChanged(T oldValue, T newValue){Binder.Unbind(oldValue);Binder.Bind(newValue);}}

UnityGuiView中有一个BindingContext的属性, 当使用框架时,需要给View的BindingContext指定对应的ViewModel:
  public class Install:MonoBehaviour{// Use this for initializationpublic SetupView setupView;public TestView testView;void Start(){//绑定上下文setupView.BindingContext=new SetupViewModel();testView.BindingContext=new TestViewModel();}}

在View中,就订阅model数据改变的消息,并定义相应的响应函数:
 public class SetupView:UnityGuiView<SetupViewModel>{//......省略ui元素的定义protected override void OnInitialize(){base.OnInitialize();Binder.Add<string>("Name", OnNamePropertyValueChanged);Binder.Add<string>("Job",OnJobPropertyValueChanged);Binder.Add<int>("ATK",OnATKPropertyValueChanged);Binder.Add<float>("SuccessRate",OnSuccessRatePropertyValueChanged);Binder.Add<State>("State",OnStatePropertyValueChanged);}private void OnSuccessRatePropertyValueChanged(float oldValue, float newValue){successRateMessageText.text = newValue.ToString("F2");}private void OnATKPropertyValueChanged(int oldValue, int newValue){atkMessageText.text = newValue.ToString();}private void OnJobPropertyValueChanged(string oldValue, string newValue){jobMessageText.text = newValue.ToString();}private void OnNamePropertyValueChanged(string oldValue, string newValue){nameMessageText.text = newValue.ToString();}private void OnStatePropertyValueChanged(State oldValue, State newValue){//dosomething
        }

最后看一下其中一个model的定义:

 public class Combatant{public int Id { get; set; }public string Name { get; set; }public string Job { get; set; }public float SuccessRate { get; set; }public State State { get; set; }}public enum State{JoinIn,Wait}

4、总结

本文只大概写了一下uMVVM框架的一些设计和使用方法,不全面,如果感兴趣,可以自行阅读源码,github地址为https://github.com/MEyes/uMVVM
如有错误,欢迎指正!

转载于:https://www.cnblogs.com/IAMTOM/p/10303392.html

MVVM框架在unity开发中的使用相关推荐

  1. java web框架struts_Struts框架在Web开发中的应用

    <Struts框架在Web开发中的应用>由会员分享,可在线阅读,更多相关<Struts框架在Web开发中的应用(29页珍藏版)>请在人人文库网上搜索. 1.Struts,框架在 ...

  2. Unity 开发中常见问题 Unity bug reporter

    Unity开发过程中常常因为操作导致Unity奔溃,再次打开是会出现Unity bug reporter之后无论这么样你都再也打不开你的工程了.无论你重装多少次还是打不开你原来的那个工程. 这个时候其 ...

  3. 结合Unity开发中一些编程基础概念与原理性知识总结

     目录: //里氏替换 //抽象类和接口 //虚函数(方法)和抽象方法.普通方法.重载.重写 //指针.引用.值类型.引用类型 //程序.进程.线程.死锁.协程 //内存的几个分区及其作用 //con ...

  4. 若依框架二次开发中的坑

    1.是目录不是菜单 2.:key的级联按钮的强制刷新 3.动手做

  5. 领域驱动和MVVM应用于UWP开发的一些思考

    领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...

  6. java spring server_Java server框架之(1):spring中的IoC

    为什么需要IoC? 一般的对象耦合是在编译时确定的,也就是说当我们写如下类: 1 public classStaticCoupling { 2 3 String s = new String(&quo ...

  7. C#重要知识点在游戏开发中的应用

    今天是大年初二,在此祝各位程序员朋友身体健康,猪年大吉.闲来无事,把在Unity开发中所使用的C#知识点总结了一下,因为自己在带团队新人的时候,好多知识点它们并不是很清楚,编写代码还是局限于" ...

  8. mvvm模式和mvc的区别_Android 开发中的架构模式 -- MVC / MVP / MVVM

    预备知识 了解 Android 基本开发 看完本文可以达到什么程度 了解如何分析一个架构模式 掌握 MVC,MVP,MVVM 架构定义和实现 更多面试内容,面试专题,flutter视频 全套,音视频从 ...

  9. 3 ie兼容 vue_前端开发:MVVM框架之Vue势必会取代JQuery吗?

    最近接受一个新项目,前端是选用jquery还是用vue这个问题,团队里面就产生了分歧,我作为项目负责人,最终决定新项目采用Vue,原因如下: 1.本次项目界面和后台数据交互比较多,采用mvvm框架开发 ...

最新文章

  1. python修改第三方库重写_Python安装第三方库,切换镜像源
  2. 写了多年代码,你会 StackOverflow 吗
  3. tomcat(11)org.apache.catalina.core.StandardWrapper源码剖析
  4. java 防止sql xxs注入,Java-JSP网站 防SQL注入,防XSS等攻击有什么好的处理办法?...
  5. 8 PP配置-生产主数据-工作中心相关-定义工作中心负责人
  6. 反向输出一个四位数c语言程序,将一个四位数反向输出
  7. @程序员,你该如何做职业规划才能不被“废”?
  8. mysql可视化创建外键说明_关于使用可视化图形工具navicat for mysql来创建外键的步骤...
  9. 用python读取图像_如何用python获取图像
  10. 【Flutter】微信项目实战【03】我的界面搭建(下)
  11. 睿智的seq2seq模型4——往英文到法文的翻译里加上注意力机制
  12. 计算机装配方案之游戏发烧型,5000元Intel八代i5-8500配RX580电脑配置 畅玩各类中大型游戏...
  13. 惊帆健康监测模块,心率检测模块
  14. 大数据挖掘与分析——用八爪鱼爬虫采集百度搜索内容
  15. mysql中两根竖线什么意思_五线谱中两根竖线是什么意思?
  16. 3款大数据bi工具,让企业数据分析更简单
  17. 湖北浓郁炖黄油鸡汤(三黄鸡)详细做法
  18. 回味一下——仿2008QQ面板导航
  19. 递归函数与内置函数和函数式编程
  20. 树莓派oled IP显示

热门文章

  1. (附源码)计算机毕业设计SSM职工社保信息管理系统
  2. 矩阵的负二分之一次方
  3. Java Stram之“筛选与切片”的简介说明
  4. 基于单片机的二维高精度液晶显示电子指南针
  5. 【论文笔记】Spectral-Spatial Exploration for HSIC via the Fusion of FCN
  6. 《深入理解Linux网络技术内幕》阅读笔记(十一)
  7. 51单片机的中断嵌套怎么实现呢?
  8. StatusBar状态栏设置及设备适配
  9. 学习光线追踪(8)---材质反射
  10. nginx实现并发连接与IP流量限速功能