当前位置: 首页 > news >正文

【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状态,而血条和蓝条需要对应产生改变(同一个消息,由不同对象自行处理)。

相关文章:

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

前言 最近在学习Unity游戏设计模式,看到两本比较适合入门的书,一本是unity官方的 《Level up your programming with game programming patterns》 ,另一本是 《游戏编程模式》 这两本书介绍了大部分会使用到的设计模式,因此很值得学习 本…...

CDH安装和配置流程

这份文件是一份关于CDH(Clouderas Distribution Including Apache Hadoop)安装的详细手册,主要内容包括以下几个部分: 1. **前言**: - CDH是基于Apache Hadoop的发行版,由Cloudera公司开发。 - 相比…...

SpringMVC:SpringMVC执行流程

文章目录 一、介绍二、什么是MVC 一、介绍 Spring MVC 是一种基于Java的Web框架,它采用了MVC(Model - View - Controller)设计模式,通过吧Model、View和Controller分离,将Web层进行职责解耦,把复杂的Web应…...

如何在前端网页实现live2d的动态效果

React如何在前端网页实现live2d的动态效果 业务需求: 因为公司需要做机器人相关的业务,主要是聊天形式的内容,所以需要一个虚拟的卡通形象。而且为了更直观的展示用户和机器人对话的状态,该live2d动画的嘴型需要根据播放的内容来…...

昇思25天学习打卡营第15天|linchenfengxue

Pix2Pix实现图像转换 Pix2Pix概述 Pix2Pix是基于条件生成对抗网络(cGAN, Condition Generative Adversarial Networks )实现的一种深度学习图像转换模型,该模型是由Phillip Isola等作者在2017年CVPR上提出的,可以实现语义/标签到…...

软考中级数据库系统工程师备考经验分享

前几天软考成绩出了,赶紧查询了一下发现自己顺利通过啦(上午63,下午67,开心),因此本文记录一下我的备考经验分享给大家。因为工作中项目管理类的知识没有系统学习过,本来想直接报名软考高级证书…...

Centos7删除MariaDB

在 CentOS 7 上删除 MariaDB 可以通过 yum 包管理器来完成。以下是一步一步的指导: 打开终端:首先,你需要打开你的 CentOS 7 系统的终端。 停止 MariaDB 服务(如果正在运行):在卸载 MariaDB 之前&#xff…...

【Docker系列】Docker 镜像构建中的跨设备移动问题及解决方案

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

C++友元函数和友元类的使用

1.友元介绍 在C++中,友元(friend)是一种机制,允许某个类或函数访问其他类的私有成员。通过友元,可以授予其他类或函数对该类的私有成员的访问权限。友元关系在一些特定的情况下很有用,例如在类之间共享数据或实现特定的功能。 友元可以分为两种类型:类友元和函数友元。…...

黑马苍穹外卖技术亮点 详情

1.使用工厂模式和策略模式实现布隆过滤器解决缓存穿透问题 Bitmap Bitmap是一种数据结构,它使用位图来表示数据。在处理大量数据时,Bitmap可以通过将每个数据元素映射到一个位,然后使用位运算来对数据进行操作。 通过使用Bitmap&#xff0c…...

Python酷库之旅-第三方库Pandas(005)

目录 一、用法精讲 7、pandas.read_clipboard函数 7-1、语法 7-2、参数 7-3、功能 7-4、返回值 7-5、说明 7-6、用法 7-6-1、代码示例 7-6-2、结果输出 8、pandas.DataFrame.to_clipboard函数 8-1、语法 8-2、参数 8-3、功能 8-4、返回值 8-5、说明 8-6、用法…...

javascripr如何设计弹出输入框并在网页内输出输入内容

javascript如何设计弹出输入对话框 这里就需要用到prompt语言 它的语法格式是 prompt(对话框内容) 如何把在对话框里输入内容输出到网页里,需要先定义一个变量,用var或let都可以。 假定变量名为a,代码是 let aprompt(请输入…...

gitee代码初次上传步骤

ps. 前提是已经下载安装gitee 一、在本地项目目录下空白处右击,选择“Git Bash Here” 二、初始化 git init 三、添加、提交代码(注意add与点之间的空格) git add . git commit -m 添加注释 四、连接、推送到gitee仓库 git remote add …...

android调用openssl库

android 调用openssl库 一、openssl安装编译 下载openssl-1.1.1w.tar.gz和android-ndk-r21e-linux-x86_64.zip解压android-ndk-r21e-linux-x86_64.zip到/opt/pj_ssl目录下,然后配置环境 vim ~/.bashrc增加如下内容 export NDK_HOME/opt/pj_ssl/android-ndk-r21e…...

Hugging face Transformers(3)—— Tokenizer

Hugging Face 是一家在 NLP 和 AI 领域具有重要影响力的科技公司,他们的开源工具和社区建设为NLP研究和开发提供了强大的支持。它们拥有当前最活跃、最受关注、影响力最大的 NLP 社区,最新最强的 NLP 模型大多在这里发布和开源。该社区也提供了丰富的教程…...

kubernetes集群部署:环境准备及master节点部署(二)

主机名IPv4地址IPv6地址角色安装组件操作系统k8s130-node190192.168.XX.190240a:XX::190masterkubeadm、kubelet、containerdAnolis OS 8.94.19.91-28.1.an8.x86_64k8s130-node191192.168.XX.191240a:XX::191nodekubeadm、kubelet、cri-oAnolis OS 8.94.19.91-28.1.an8.x86_64k…...

第8篇 智能合约的商业应用场景解析

一、引言 在区块链技术的众多应用中,智能合约无疑是其中的一颗璀璨明珠。它通过自动化、去中心化和不可篡改的特性,为商业世界带来了革命性的变革。今天,我们将一同探索智能合约在十个不同行业中的实际应用,感受其独特的魅力。 二、智能合约的商业应用案例 供应链管理:…...

Zabbix 配置grafana对接

zabbix对接grafana简介 Zabbix与Grafana对接可以实现更加丰富和美观的数据可视化,可以利用Grafana强大的可视化功能来展示Zabbix收集的数据。 Grafana 本身是提供了Zabbix的对接插件,开箱即用,安装好了之后点击 enable 一下就能启用。然后就…...

三相感应电机的建模仿真(2)基于ABC相坐标系S-Fun的仿真模型

1. 概述 2. 三相感应电动机状态方程式 3. 基于S-Function的仿真模型建立 4. 瞬态分析实例 5. 总结 6. 参考文献 1. 概述 前面建立的三相感应电机在ABC相坐标系下的数学模型是一组周期性变系数微分方程(其电感矩阵是转子位置角的函数,转子位置角随时…...

开源全新H5充值系统源码/自定义首页+充值页面/灵活对接上游渠道接口

开源全新H5充值系统源码,系统基于thinkphp框架开发,功能已全完善,可灵活对接其他上游渠道接口,默认对接了大猿人接口,另外可无限制自定义创建充值页面,首页支持后台自定义修改,支持三级分销&…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...