开装潢公司做网站,像做游戏一样编程的网站,微信扫码关注登陆wordpress,云南网站开发公司介绍前言 
最近在学习Unity游戏设计模式#xff0c;看到两本比较适合入门的书#xff0c;一本是unity官方的 《Level up your programming with game programming patterns》 ,另一本是 《游戏编程模式》 
这两本书介绍了大部分会使用到的设计模式#xff0c;因此很值得学习 
本… 前言 
最近在学习Unity游戏设计模式看到两本比较适合入门的书一本是unity官方的 《Level up your programming with game programming patterns》 ,另一本是 《游戏编程模式》 
这两本书介绍了大部分会使用到的设计模式因此很值得学习 
本专栏暂时先记录一些教程部分深入阅读后续再更新 文章目录 前言那么什么是MVCMVP架构示例用MVP完成上述的技能系统 那么什么是MVC 
MVC架构是本系列的重中之重MVC框架相信大部分程序员尤其做前后端的都不会陌生。MVC的全称是Model-View-Controller模型-视图-控制器由于Controller才是中间部分也许MCV更适合它 
Improve Your Unity Code with MVC/MVP Architectural Patterns MVC 背后的一般思想是将软件的逻辑部分 与数据 和UI(显示窗口) 分开。这有助于减少不必要的依赖关系。 顾名思义MVC 模式将应用程序拆分为三层 
Model存储数据模型严格来说是一个保存值的数据容器。它不执行游戏逻辑或运行计算。View是界面视图在屏幕上格式化和呈现数据的图形表示。Controller处理逻辑把它想象成大脑。它处理游戏数据并计算值在运行时的变化情况。 
在Unity中通常数据返回不是直接由Model给View依然需要借助Controller进行 Model负责数据的存储它负责在运行时保存一些基本数据和状态也需要管理例如UI相关的一些数据它会包含一定的数据持久化的功能但是不等同于存档这类完全持久化。因为它的主要目的是准确且有意义的表示数据而非存储和检索数据。 
举个例子Model可以用于管理一些游戏中类的序列化信息或者玩家游戏设置选项的状态这些状态在游戏中是实时更新的且不需要进行增删改查等复杂的数据操作。 View是一个展示窗口在Unity中就是UI。我们玩家不会直接对数据进行操控但是我们可以看到View给我们返回的数据信息并对View进行控制。玩家对数据的所有控制都应该通过View类来进行。由于View在Unity中通常都是UI所以我们通常会让View继承MonoBehaviour类。Controller和Model是否继承Mono其实都可以 Controller是控制器当玩家操作View的时候View需要触发Controller的数据处理逻辑并实时更新Model中的数据。 
一般来说User和Controller之间是没有交互逻辑的上图中有些特殊User直接和Controller之间进行了交互这是因为游戏中的User往往是游戏人物所以本质上游戏人物也属于View的一类通常需要将Controller相关脚本挂载在游戏角色上因此可以通过设备按键来访问Controller中的逻辑。 MVC框架的核心是单一责任即每部分只完成一件事情 MVP架构 在Unity中MVC的一种变体——MVP架构更适合游戏开发。MVP架构的流程更加线性由用户使用ViewView通过Presenter来修改ModelModel的返回值也将通过Presenter触发对View的显示修改。 将MVP架构放到一个完整的游戏系统中如上述所示首先玩家通过View的Button点击事件触发技能释放。按钮事件中注册了Controller中的一些事件因此Controller中的事件触发——技能被放入了技能释放队列上图中这个队列是命令模式存储了一系列命令并让Controller执行并由Timer来计算冷却时间。并且在释放技能后Model中的属性要产生对应变化——例如蓝量减少。 
将MVP架构中加入事件总线那么在Controller中还需要将事件的触发信息传输给事件总线让总线中的其他事件也接收到技能触发的信息以进行相应操作——例如怪物接受到了技能触发的通知则触发受伤事件。 
上述架构中的View不完全等于UI组件可以是包含一系列UI组件的一个类并设置一些UI更新的方法——只要控制View更新的逻辑本身不在View中执行即可。 
最后上述的所有MVC脚本都被一个继承了MonoBehaviour的Ability System统一管理因为Controller并没有继承MonoBehaviour这样就可以根据Unity 的生命周期在Update中调用Controller的Update方法了。 示例用MVP完成上述的技能系统 先晒一下结构图整个结构不会很复杂只是涉及到的类比较多 
最核心的理念是Model和View是一定不能耦合的只能通过Controller这个中间系统来进行交互由Controller来执行逻辑而对于事件的处理只需要Controller向事件总线发送消息由注册了事件总线的监听者们接收到消息后自行处理数据。 
而视图逻辑则只定义在View中如按钮接受Input后触发事件。Model则只负责处理本身的数据。View和Model之间彼此是不知道对方的存在的。 
一般由View发送指令给ControllerController中读取了Model调用内部事件处理View和Model的交互以实现Model的读写再返回视图处理给View改变视图。这样的调用事件发生顺序就是MVP的体现。所以Unity中的MVC大部分还是以MVP为主。事件调度是较为线性的。 
通常Model不继承MonoBehaviour因为Model类只管理数据数据不需要生命周期处理。所有的程序的生命周期处理只会再Controller和View中所以这两个常常需要继承MonoBehaviour。 我们使用MVC架构在AbilitySystem中定义了技能栏中技能属性AbilityItem继承了ScriptableObjects并初始化在点击属性对应的键盘Key值时触发了View中组件的生命周期事件从而调用了Controller中为组件注册的委托委托调用后Controller发送了一条技能事件消息AbilityEvent因此所有在AbilityEvent Bus中注册的对象们接收到消息后都进行了对应的处理。可以看到提示了使用技能消耗的血量和蓝量每个技能对应进入CD状态而血条和蓝条需要对应产生改变同一个消息由不同对象自行处理。