【Unity设计模式】✨使用 MVC 和 MVP 编程模式

在这里插入图片描述


前言

最近在学习Unity游戏设计模式,看到两本比较适合入门的书,一本是unity官方的 《Level up your programming with game programming patterns》 ,另一本是 《游戏编程模式》

这两本书介绍了大部分会使用到的设计模式,因此很值得学习

本专栏暂时先记录一些教程部分,深入阅读后续再更新


文章目录

  • 前言
  • 那么什么是MVC?
  • MVP架构
  • 示例:用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架构的流程更加线性,由用户使用View,View通过Presenter来修改Model,Model的返回值也将通过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发送指令给Controller,Controller中读取了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状态,而血条和蓝条需要对应产生改变(同一个消息,由不同对象自行处理)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

六西格玛培训引领久立特材品质新高度,行业领军再升级

久立特材六西格玛管理项目于6月27 日启动。久立特材作为行业内的领军企业,此次引入六西格玛管理法,旨在进一步提升企业运营效率和产品质量,实现持续改进和卓越运营。 久立特材的高层领导与张驰咨询的资深顾问朱老师共同出席项目启动仪式&am…

【python刷题】蛇形方阵

题目描述 给出一个不大于 99 的正整数n,输出n*n的蛇形方阵。从左上角填上1开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用3个字符,前面使用空格补齐。 输入 输入一个正整数n,含义如题所述 输出 输出符合…

【正点原子K210连载】 第十二章 跑马灯实验 摘自【正点原子】DNK210使用指南-CanMV版指南

1)实验平台:正点原子ATK-DNK210开发板 2)平台购买地址https://detail.tmall.com/item.htm?id731866264428 3)全套实验源码手册视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 第十二章 跑马灯实验…

Cmake使用笔记1

cmake 问题1: Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.19043. 问题分析 在Windows平台上,使用CMake或Visual Studio等开发工具时,选择正确的Windows SDK版本以确保你的应用程序能够针对目标Windows版本进行编…

iptables(12)实际应用举例:策略路由、iptables转发、TPROXY

简介 前面的文章中我们已经介绍过iptables的基本原理,表、链的基本操作,匹配条件、扩展模块、自定义链以及网络防火墙、NAT等基本配置及原理。 这篇文章将以实际应用出发,列举一个iptables的综合配置使用案例,将我们前面所涉及到的功能集合起来,形成一个完整的配置范例。…

SpringMVC的架构有什么优势?——控制器(一)

文章目录 控制器(Controller)1. 控制器(Controller):2. 请求映射(Request Mapping):3. 参数绑定(Request Parameters Binding):4. 视图解析器(View Resolver):5. 数据绑定(Data Binding):6. 表单验证(Form Validation)…

TAPD项目管理软件无法与企业微信进行关联

TAPD一段时间未使用后,需要重新启动,此时会出现你的企业微信尚未与TAPD账号关联的提示 解决方案:找到TAPD应用,先删除应用,然后再解除禁用即可

树洞陪聊陪玩交友程序系统源码,解锁交友新体验

在繁忙的都市生活中,你是否渴望找到一片属于自己的秘密花园,倾诉心声、分享快乐?今天,就让我带你走进这片名为“树洞”的神秘之地,感受陪聊陪玩交友的全新魅力! 🌳树洞陪聊陪玩交友程序系统 你…

DC/AC电源模块:为智能家居设备提供恒定的电力供应

BOSHIDA DC/AC电源模块:为智能家居设备提供恒定的电力供应 DC/AC电源模块是一种常见的电源转换器,它将直流电源(DC)转换为交流电源(AC),为智能家居设备提供恒定的电力供应。在智能家居系统中&a…

【React】portal

createPortal 允许你将 JSX 作为 children 渲染至 DOM 的不同部分。 createPortal(children, domNode, key?) 使用 portal 渲染模态对话框 import NoPortalExample from "./components/NoPortalExample"; import PortalExample from "./components/PortalEx…

JVM(11):虚拟机性能分析和故障解决工具之jstack工具

1 jstack(Stack Trace forJava)作用 查看或导出 Java 应用程序中线程堆栈信息 。 线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、长时间等待外部资源等…

案例:MySQL主从复制与读写分离

一、案例分析 1.案例概述 在实际的生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,一般来说都是通过主从复制(Master-Slave)来同步数据,再通…

uniapp + vite中 uni.scss 使用 /deep/ 不生效(踩坑记录三)

vite 中使用 /deep/ 进行样式穿透报错 原因:vite 中不支持,换成 ::v-deep 或:deep即可

浅谈人工智能发展趋势

第三次浪潮 人类科技发展的主线正沿着“能源”和“新型”展开。AI的尽头是光伏和储能。 如今我们正在经历第三次浪潮——信息文明。 社会生产力 劳动对象 劳动工具 劳动者 生产要素 农业文明铜器铁器 材料 人力工具 农民 土地人力 工业文明机车电力 材料动力 动力…

Java web应用性能分析之【prometheus监控K8s指标说明】

常规k8s的监控指标 单独 1、集群维度 集群状态集群节点数节点状态(正常、不可达、未知)节点的资源使用率(CPU、内存、IO等) 2、应用维度 应用响应时间 应用的错误率 应用的请求量 3、系统和集群组件维度 API服务器状态控…

2024 vue3入门教程:01vscode终端命令创建第一个vue项目

参考vue官网手册:https://cn.vuejs.org/guide/quick-start.html 一、找个盘符,新建文件夹存储以后得vue项目 我的是e盘下创建了vueproject 二、使用vscode打开存储vue项目的文件夹 因为我生成过项目,所以有文件,你们初次是没有…

IT专业入门,高考假期预习指南

文章目录 一、了解IT专业的基本概念二、选择适合的编程语言入门三、掌握基本的编程工具和环境四、学习基础的数据结构和算法五、实践项目和动手实验六、利用在线资源进行学习七、参加编程竞赛和社区活动总结 高考结束后,许多同学将迎来大学生活,而对于选…

DataWhaleAI Tsak1 运行Baseline

题目背景 在当今数字化时代,企业积累了丰富的对话数据,这些数据不仅是客户与企业之间交流的记录,更是隐藏着宝贵信息的宝库。在这个背景下,群聊对话分角色要素提取成为了企业营销和服务的一项重要策略。 群聊对话分角色要素提取…

nlp--最大匹配分词(计算召回率)

最大匹配算法是一种常见的中文分词算法,其核心思想是从左向右取词,以词典中最长的词为优先匹配。这里我将为你展示一个简单的最大匹配分词算法的实现,并结合输入任意句子、显示分词结果以及计算分词召回率。 代码 : # happy coding…

Tektronix泰克 AWG70001A 任意波形发生器

Tektronix泰克 AWG70001A 任意波形发生器 AWG70000A 系列任意波形发生器 (AWG) 在采样率、信号保真度和波形内存方面代表着尖端水平,特别适合复杂器件、系统和实验的设计、测试和操作。由于高达 50 GS/s 采样率和 10 位垂直分辨率,它提供了优秀的信号激…