unity MVVM框架应用

来源:互联网 发布:局域网视频通话软件 编辑:程序博客网 时间:2024/06/05 05:19

    好久没写博客,难得空闲一下写一篇博客。关于mvvm框架先简洁的介绍一下,所谓的m是模型层,v视图层,vm视图模型层,模型层具体就是我们建的具体的类,即纯粹是一个数据类,里面存在一些字段和属性,然后没有其他的。视图层嘛就是我们的ui了,即一个image,一个text,而视图模型就是填充视图层所需要的数据模型。即填充一个image需要一个图片的索引,填充一个text需要一个字符串,等等,所以视图模型层是处理视图显示逻辑,例如给一个text显示什么样的字符串等等。而模型层给视图模型层提供我们游戏的真实数据,比如玩家装配的一件武器,玩家当前的天赋和符文等等。所以模型层给模型视图层提供显示逻辑所需要的填充的数据,模型视图层和视图层是绑定的,模型视图层里面的填充数据发生变化的时候,视图层发生相应的变化,例如模型层里面玩家的装备中有一件武器升级了,那么对应得vm层中的填充数据就会受到模型层的改变而改变从而影响到视图层显示。说到这里我就有点纳闷了那还干嘛还要视图模型层了,直接让模型层和视图层交互不就得了么,哎 这不是多此一举么。其实不然,之所以开发这样一个框架的主要原因是节省程序员的工作。这样我们的程序员就不用去如何摆放那个ui摆在什么位置,该怎么摆,一般游戏公司的美术ui都会把每个场景的ui都摆放好,程序员只需要做相应的数据填充工作,所以这样就大大节省了开发工作了。首先介绍插件中的vm层,我们将它称为Context数据上下文。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using com.klw.lib.core;using DataBind.Core.Data;using MainGame;using UI.Windows;namespace Contexts{    public class MainGameContext:Context    {        private readonly Property<float> scoreProperty = new Property<float>();             public float Score        {            get { return scoreProperty.Value; }            set { scoreProperty.Value = value; }        }        private readonly Property<int> levelProperty = new Property<int>();        public int Level        {            get { return levelProperty.Value; }            set { levelProperty.Value = value; }        }        private readonly Property<float> progressProperty = new Property<float>();        public float Progress        {            get { return progressProperty.Value; }            set { progressProperty.Value = value; }        }        private readonly Property<int> leftPiecesProperty = new Property<int>();        public int LeftPieces        {            get { return leftPiecesProperty.Value; }            set { leftPiecesProperty.Value = value; }        }        public void PauseGame()        {            new PauseGameMessage(true,true).Send();        }    }}
其中包括属性和方法。属性的定义格式必须为

        private readonly Property<T> xxProperty = new Property<T>();        public int mmmm        {            get { return xxProperty.Value; }            set { xxProperty.Value = value; }        }

其中xxProperty前面的xx第一个字母必须小写,然后后面的mmmm就随便起名字没有限制,接着就是方法,主要是针对button事件做绑定的。简单的介绍了一下模型视图层,接下来就来介绍一下模型视图层和视图是怎么绑定的。

 public class TextTextSetter : ComponentSingleSetter<Text, string>    {        #region Methods        /// <summary>        ///   Called when the data binding value changed.        /// </summary>        /// <param name="newValue">New data value.</param>        protected override void OnValueChanged(string newValue)        {            if (this.Target != null)            {                this.Target.text = newValue;            }        }        #endregion    }
这个是对ui中Text视图进行绑定的,所有的的ui绑定都应该继承CompontSingleSetter<T,V> 其中T继承Monobehavior,V继承一般的类(不能是MonoBehavior,不能是静态类,可以是一些简单的数据机构例如int ,string,float,也可以是一个类,一个结构体),其中最重要的是我们要重写一个方法。
OnValueChanged(V newValue)

其中v的类型和CompontSingleSetter<T,V>中的泛型V类型保持一致。接下来截图怎么用

首先我们在Canvas上挂载一个Context Holder一般这个组件都挂载Canvas上面,当然也可以挂载其他上面,但是我还是强烈建议挂载到Canvas上面然后我们现在就开始对相应的ui视图和对应得数据模型进行绑定了。图如下


这里我们对一个Text绑定它所对应的Context的一个属性Text,游戏运行的时候我们再对Canvas上面Context Holder的context赋值。好了今天都讲完了,今天讲到的其实是针对一些RPG游戏用的,因为小的游戏那种对话框比较少,必要性不是很大,那种RPG游戏弹出来的对话框可能有10几个之多。以后有时间再讲一下关于RPG游戏一些其他的插件及一些有用的知识。有问题Q我 我的qq号:1850761495 插件地址:http://pan.baidu.com/s/1hrWFRXM


原创粉丝点击