提到游戏的UI开发,几乎没人没听说过MVC吧?MVC最早是为软件架构设计的框架,这里不打算讲MVC的演变过程,需要的了解的可以参考大神的文章,传送门:

你对MVC、MVP、MVVM 三种组合模式分别有什么样的理解?

高赞回答。

另外,我也喜欢第二个回答的总结:

M-V- X 本质都是一样的 重点还是在于M-V 的桥梁,要靠X来牵线。

在相同技术栈下 能够实现的各种 X都可以是大同小异的。

在不同技术栈下 相同的X可能实现都大相径庭,仅有非常抽象的流程类似。

所以UI部分的开篇我们不讲代码,只讲概念。

1.1 M-V-C

看下百度百科的定义:

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

架构的兴起有它的时代和背景意义,那么随着时代的变迁,工具和大环境甚至是目标设备的变化,框架都是需要逐步调整的。

MVC出现的初衷是源自于与操作系统和软件的日益复杂化。MFC或者VB那种界面和逻辑揉在在一起的模式已经远远不能满足于大型复杂的功能系统开发。

然后随着软件行业的日益成熟,团队的职能分工也越来越明确,那么如何揉在一起的任务拆离出来,让不同职能的人专注于自己的领域和设计也是一个重要的方面。

基于很多的原因,软件UI框架开始分化为M-V-C的模式。M层专注于数据处理, V层专注实现的专注于表现,柱状图,饼状图、表格按你意愿。

一个典型的MVC的框架可以这么表示:

话说真的爱死 Unity的Animator编辑器了,好方便。

可以看到这是一个局部生态的自给自足。考虑了大部分的交互和变更情况,并通过规定每个部分的职能来满足功能需求。

但是MVC并不是完美的,严格来说它是只是一种指导性的框架,是综合了大部分的软件需求和时代发展结合得出的相对较优的方案。这种模式仍然存在它的缺陷:

1.局部生态,数据(M层)封闭,如果多个模块需要同一个数据块,数据之间的互通和重用性都非常的低效。

2.局部耦合,虽然在大的环境下实现了局部封闭,但是局部内的各个层之间的逻辑耦合还是很深。

想象一下,如果把上面的局部展示放大到游戏开发中的话会是什么样?

在这个情境下,MVC的框架就不能很好的应对了。游戏数据很多时候是互相依赖,并不能完全封闭。比如角色的属性展示需要用到背包里的装备,背包需要显示货币,货币可能受某些角色属性影响,任务依赖角色等级,同时奖励货币和道具、装备等等。

那么这种情况下,MVC要么需要将M写的非常复杂,每遇到一个新的需求开出一个新的接口,提供数据插叙或者变更,要么写一个通用的M管理器,用来统一中转数据。

在游戏开发这种需求多变,并且数据嘈杂的背景下,无论哪种都不能很好的应对需求,并且开发人员会受到无尽的折磨,在遵循架构和实现需求的之间来回纠结,摩擦,最终写的不伦不类,BUG还超多。

1.2 M-V-P

有需求就要有变化,当一个需求只是个别现象的时候,你可以特殊处理、特殊对待。但需求大批量出现的时候,就得重新审视现在的实现是不是需要重构或者升级了。

来看看谷歌的MVP模式:

https://github.com/googlesamples/android-architecture/tree/todo-mvp/github.com

MVP即Model-View-Presenter。

Model的工作就是完成对数据的操纵,数据的获取、存储、数据状态变化都是model层的任务,如网络请求,持久化数据增删改查等任务

View只处理视图相关,不做任何逻辑处理。

Presenter作为桥梁,处理所有二者之间的中转。

在这个模式下,M和V的连接被完全切断了,以前C层只是负责一些简单的转发和处理,现在P的任务变的更重,除了桥梁的作用之外,还需要做初步甚至高级的逻辑处理来处理M-V或者V-M的交流过程。

居然P的任务变重了,那么相对来说,P也会变得更加臃肿和难以维护,但是好处是将M和V彻底解耦,不管哪一方的实现方式发生变化,只要最终和P同步的数据不变另一方都不需要关心和修改。

另外V的逻辑功能一部分移入P之后,V可以更加专注的处理自身的表现,同时因为对接是通过接口实现的,所以满足接口的各种测试或者模拟都能够得以使用。

另外这里每一个V都对应一个P,写法非常复杂,软件复杂的时候,类和文件贼多。并且它仍然没有解决M复用的问题。

1.3 M-V-VM

MVVM是Model-View-ViewModel的简写。

从示意图上最直观的感受是两个:

1.使用ViewModel替代了Presenter。

2.原本P和V一对一的关系现在变为VM-V一对多的关系。

这解决了什么问题呢?

1.VM在一定程度上能够重用,就表示M层在一定程度上也可以复用了。

2.VM一对多的关系,表示在类和文件的数量和管理上要减轻很多。

VM是通过DataBinding的技术实现V和M之间的关系映射。抛弃了P层的手动关系接口和维护。当然每种技术都有其存在的意义和解决的问题。至于选取什么样的方案去解决问题,就要看项目自己的需求更符合哪一类的设计。如果都没有那就需要自己去实现变种或者是新的设计,当然也可以修改需求的啦。

1.4 游戏开发应该使用什么?

注意,以上的三种方法都是来源于软件,都是来源于软件,都是来源于软件 。游戏开发中也都是套用这些概念来进行UI的开发设计的。至于实现过程依据引擎和平台的差别肯定是不一样的,那么我们使用什么样的方式呢?

我的UI框架设计里,没有使用DataBinding技术,要仔细来看的话,它可能不属于以上的任意一种。那么我给它命名为MVE!即Model-View-Event。

MVC重点逻辑在V,MVP重点逻辑在P,MVVM,重点逻辑还是在V和VM,V负责UI逻辑部分,VM负责数据绑定部分。

那么MVE可以认为是MVC的一个变种,但是V会和数据中心共享。

话不多说看图:

作为网络游戏来说,数据应该来自两个部分,一部分是策划编辑的数据,一部分是通过服务器下发的数据。界面通过注册事件来订阅指定的事件类型,数据中心通过和服务器之间的交互来获得或者改变数据,并根据需求推送指定的Event,当界面关心的事件发生的时候,它有两个可能,一部分是动态变化的局部更新,可以通过事件带下来,另外一种是整体数据需要去数据中心获取。

举个例子,当我打开背包界面的时候,我需要知道所有的背包数据,因此V和M直接交互,拿到背包的所有道具,并显示自己。然后我吃掉了一个经验丹,这时候服务器会告诉客户端删除一个物品,这个时候数据层会通过事件触发,背包监听了这个事件,然后查找对应的道具ID,删除,然后对背包道具进行局部重新排列刷新。

假设我们还有一个界面叫做一键升级,可以选择吃掉背包内不同种类的经验丹,那么它打开的时候同样找数据中心拿取道具这部分相关的数据做显示,如果这个时候在背包内吃掉一个,那么同样监听了这条消息的一键升级界面也要重新显示数量。

所以V和M的关系只是查询,并不会改变数据,数据的变化只能来自于服务器的协议驱动。(当然一些客户端自定义的用于辅助的数据,比如排序列表,计时器等VIEW层自己变化就好。)

另外,其实开篇我也有提到,这里再说一下:

M-V-X 本质都是一样的 重点还是在于M-V的桥梁,要靠X来牵线。

在相同技术栈下 能够实现的各种 X都可以是大同小异的。

在不同技术栈下 相同的X可能实现都大相径庭,仅有非常抽象的流程类似。

再者,不管是框架还是设计模式都是为了解决实际问题的,不需要也不应该为了设计而过度设计,但是也不能完全没有章法,胡乱定义。

一个稳定的,有序的能满足项目需求的实现就是好的实现。切莫过度纠结设计模式和框架结构,但是也不能轻视这部分,够用就好,够用就好。

Unity手游实战:从0开始SLG——UI框架篇(一)各种UI框架模型简介相关推荐

  1. Unity手游实战:ECS设计思想和Entitas插件

    Unity手游实战:ECS设计思想和Entitas插件 一.ECS设计思想 ECS设计理念并不是一个新兴的事物,早在90年代就存在了.但是走入大众视野则要归功于<守望先锋>这款游戏.201 ...

  2. Unity手游实战:从0开始SLG——客户端技术选型

    项目背景 所谓选型,我认为就是为了实现某(些)个需求或者解决某(些)个问题所使用的解决方案.它可能是一个技术方案,也可能是一个管理方案,也可以是一个软件.工具或者是流程规范. 这篇的主题是技术选型,所 ...

  3. Unity手游实战:从0开始SLG——概览

    1 游戏是一个项目 这是从0开始SLG系列的开篇,但是本篇却不准备讲SLG类型相关的东西.在开始SLG项目搭建之前,想先说下我理解的游戏开发到底是个什么东西. 游戏开发从开发模式上可以理解为一个做一个 ...

  4. Unity手游实战:从0开始SLG——本地化篇(二)TMP的优势与缺点

    1字体的基础知识 本地化的常用手段是文本翻译,而文本翻译除了上一篇文章中提到的翻译质量之外,还需要从技术手段上支持多语言在游戏中的显示. 在电子产品上展示语言或者文本,最常用的方式就是提供一个字体文件 ...

  5. Unity手游实战:从0开始SLG——逻辑与表现分离以及实战ECS架构和优化

    这是侑虎科技第612篇文章,感谢作者放牛的星星供稿.欢迎转发分享,未经作者授权请勿转载.如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨.(QQ群:793972859) 作者主页:https:/ ...

  6. Unity手游实战:从0开始SLG——ECS战斗(四)实战ECS架构和优化

    设计思想和插件介绍完了,那么就需要看看实际项目怎么去使用它. 根据策划和服务器大佬的评估,正常情况下每秒发生的战斗约2000场,我们的服务器预估为8核,如果每个核起一个战斗线程,就可以同时并发8场战斗 ...

  7. Unity手游实战:从0开始SLG——ECS战斗(三)逻辑与表现分离

    上一篇大概讲了ECS的设计思想,有提到优势也有提到劣势,优势是设计层面的,劣势是实现层面的.那么一套好的框架就是要保证如何保持优势的设计,而在实现时规避劣势所带来的问题 逻辑和表现分离.有时候也叫业务 ...

  8. 【游戏开发实战】Unity手游第一人称视角,双摇杆控制,FPS射击游戏Demo(教程 | 含Demo工程源码)

    文章目录 一.前言 二.实现方案 1.无主之地,第一人称视角 2.我之前做的摇杆控制 3.第一人称视角 + 摇杆控制 三.开始实战 1.资源获取:Unity AssetStore 2.Low Poly ...

  9. Unity手游性能测评报告——MOBA篇

    MOBA移动游戏性能分析报告:渲染.UI和逻辑代码是性能头号杀手! UWA曾经发布过MMORPG 和 ARPG 的Unity手游性能测评报告,延续该系列,最近UWA对提交测试(登陆 www.uwa4d ...

最新文章

  1. 分片提升容量难度大,时间长,故而Vitalik提出使用BCH或者ETC作为以太坊数据层
  2. javaScript设计模式---(单例模式学习)
  3. 在navicat中查看所有表的注释
  4. scrollview 与 listView 的显示不全问题
  5. mysql函数 用来查询匹配不到的数据_erlang连接mysql数据库后为什么fetch说匹配不到这个函数...
  6. ActionScript 3.0
  7. MacOS下SVN的使用
  8. paip. c++ 调用.net dll 最好方式powershell 使用总结.
  9. python手工打码_python云打码
  10. 自动生成员工号c语言,C语言课程设计级.doc
  11. android 在app内打开淘宝链接
  12. 【LaTeX PPT模板集】Beamer主题与配色使用教程
  13. Shell 命令执行可视化和告警工具
  14. 杂谈 之 闲来无事 (一)
  15. 【Temasek V9.6】CM13.0 多功能实用增强版 for 华为荣耀5X
  16. LCG随机算法在不同编程语言中的一个注意点
  17. 8大软件供应链攻击事件概述
  18. Java网络 1.17 CSS3 选择器
  19. 项目 - Web地图开发【高德地图API】(二)
  20. 切尔西老板阿布 情场传奇

热门文章

  1. XLnet和tranformer-XL的双流注意力机制
  2. python notebook配置_Jupyter Notebook简介和配置说明
  3. 菜鸟学习OGRE和天龙八部之二: 天龙八部AXP数据格式搞定
  4. 手机webApp触摸左右滑动切换轮播图片广告
  5. Android meminfo
  6. 设计云桌面不靠谱?浅谈如何挑选适合的服务
  7. 基于CRISPR等基因组编辑技术的“非转基因类”农作物改造
  8. python3 x完全兼容_Python3.X版本的代码完全兼容Python2.X。
  9. CSS Sprites精灵图(雪碧图)的使用以及利用工具制作
  10. 怎样关闭电脑开机自启动的应用