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

Unity 游戏设计模式:观察者模式

本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com

在 unity 游戏设计中,观察者模式(Observer Pattern)有着重要的作用,它主要用于实现对象之间的一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动更新。

观察者模式在游戏设计中有几个重要的作用:

松耦合(Loose Coupling): 观察者模式帮助实现了对象之间的松耦合关系。主题和观察者之间没有直接的依赖关系,使得它们能够独立地演化。这使得游戏系统更容易扩展和修改,因为一个对象的改变不会直接影响到其他对象。

事件处理: 在游戏中,有许多事件(例如玩家输入、游戏状态变化、玩家死亡等)。观察者模式使得不同的游戏元素能够订阅并响应这些事件,从而实现更灵活的事件处理机制。

实时通知: 观察者模式允许在主题状态变化时实时通知所有观察者。这对于实时性要求高的游戏系统非常重要,例如当一个敌人被击败时,所有相关的元素都能够及时做出响应。

解耦主题和观察者: 主题和观察者之间的解耦使得系统更易于维护。如果需要添加新的观察者或改变观察者的行为,可以做到不影响主题的实现,从而降低了代码的复杂性。

举个例子:

传统方式:

当玩家 HP<=0 时,要调用动画、音效、存档,每个系统都要在玩家类里引用,需要调用一系列方法。耦合性高、代码难以维护。

一个代码里耦合了多个系统。

//玩家死亡
void PlayerDead()
{// 播放死亡动画AnimationSystem.PlayDeathAnimation();// 播放死亡音效SoundSystem.PlayDeathSound();// 存档系统记录SaveSystem.SaveGame();
}

观察者模式:

在 unity 中可以通过 c# 委托函数实现观察者模式。

// 定义委托
public delegate void PlayerDeathEvent();
// 被观察者(事件源)
public class Observer : MonoBehaviour
{// 委托事件,将需要触发的一系列事件+=进来public static event PlayerDeathEvent OnPlayerDeath;//点击按钮模拟玩家死亡,玩家死亡就是一个事件//一个事件会触发多个事件Button btn;void Start(){btn = GetComponent<Button>();// 当按钮点击时(玩家死亡),触发委托事件,//点击后会触发+=进来的一系列事件:动画处理、音效处理、存档处理btn.onClick.AddListener(() =>{if (OnPlayerDeath != null){OnPlayerDeath();}});}
}// 具体的观察者类
public class AnimationSystem : MonoBehaviour
{void Start(){// 注册观察者事件,在PlayerDeathEvent里面加入需要触发的一系列事件Observer.OnPlayerDeath += PlayDeathAnimation;}void PlayDeathAnimation(){// 处理动画系统逻辑}
}// 具体的观察者类
public class SoundSystem : MonoBehaviour
{void Start(){// 注册观察者Observer.OnPlayerDeath += PlayDeathSound;}void PlayDeathSound(){// 处理音效系统逻辑}
}// 具体的观察者类
public class SaveSystem : MonoBehaviour
{void Start(){// 注册观察者Observer.OnPlayerDeath += SaveGame;}void SaveGame(){// 处理存档系统逻辑}
}

上面的代码的表示是这些相关系统在观察玩家是否死亡,一旦死亡,就会触发注册的事件,跟在玩家死亡后面执行。通过观察者模式,按钮的点击事件(玩家死亡)与其他系统的逻辑彼此解耦,不再需要直接引用对方。这使得系统更加灵活,可以方便地扩展和维护。

通过观察者模式,可以实现游戏中对象之间的松耦合关系,提高代码的可维护性和扩展性。当游戏中的某个模块需要与其他模块进行通信时,可以通过观察者模式实现一种灵活而有效的方式。

相关文章:

Unity 游戏设计模式:观察者模式

本文由 简悦 SimpRead 转码&#xff0c; 原文地址 mp.weixin.qq.com 在 unity 游戏设计中&#xff0c;观察者模式&#xff08;Observer Pattern&#xff09;有着重要的作用&#xff0c;它主要用于实现对象之间的一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#x…...

计算机体系结构安全:对体系结构如何支持安全机制进行调研

一、体系结构支持信任建立和主动防御的技术&#xff1a; 可信3.0 二、体系结构怎么更好的支持信任建立和主动防御 2.1 支持信任建立 一、以手机芯片举例&#xff0c;用智能手机的芯片作为信任根&#xff0c;确保应用程序和敏感数据受到保护。 二、启动时验证操作系统和应用…...

b站小土堆pytorch学习记录—— P15 Dataloader的使用

文章目录 一、前置知识1.dataloader简要介绍2.dataloader 官方文档&#xff08;翻译后&#xff09; 二、DataLoader的使用 一、前置知识 1.dataloader简要介绍 DataLoader 是 PyTorch 中用于加载数据的实用工具&#xff0c;它可以处理数据集的批量加载、数据集的随机打乱、多…...

小程序中使用echarts地图

一、下载并安装echarts 1、下载echarts-for-weixin组件 echarts-for-weixin项目提供了一个小程序组件&#xff0c;用这种方式可以在小程序中方便地使用 ECharts。 下载ec-canvas项目&#xff08;下载地址&#xff09; ​​ 注意&#xff1a;下载的 ec-canvas 中的echarts的版本…...

swoole协程

协程执行顺序 //hyperf框架 use Co;go(function () {Co::sleep(1); // Io等待一秒echo "hello go1 \n";});echo "hello main \n";go(function () {echo "hello go2 \n";});//打印结果hello mainhello go2hello go1/*运行此段代码, 系统启动一个…...

Android Gradle 开发与应用 (一) : Gradle基础

1. Gradle是什么 Gradle是一个通用的构建工具&#xff0c;支持诸多主要的 IDE&#xff0c;包括 Android Studio、IntelliJ IDEA、Visual Studio 等 Gradle 的底层实现(核心引擎和框架)其实是用 Java 编写的开发者通常使用 Groovy 或 Kotlin 来编写构建脚本 1.1 那么为什么Gra…...

PostgreSQL操作笔记

基础操作 数据库相关 -- 查看所有数据库 \l-- 切换到指定数据库 \c 库名-- 查看库中所有表 \d执行SQL脚本 如果有现成的SQL脚本&#xff1a; \i 脚本路径路径一般需要用单引号引起来。 如果需要当场编辑一次性的SQL脚本&#xff0c;可以&#xff1a; \e执行上述命令后会进…...

【微服务】微服务中常用认证加密方案总结

目录 一、前言 二、登录认证安全问题 3.1 认证方式选择 三、常用的加密方案 3.1 MD5加密算法 3.1.1 md5特点 3.1.2 md5原理 3.1.3 md5使用场景 3.2 AES加密算法 3.2.1 AES简介 3.2.2 AES加解原理 3.2.3 AES算法优缺点 3.2.4 AES算法使用场景 3.3 RSA加密算法 3.3…...

【Unity】实现从Excel读取数据制作年份选择器

效果预览&#xff1a; 此处利用Excel来读取数据来制作年份选择器&#xff0c;具体步骤如下。 如果只是制作年份选择器可以参考我这篇文章&#xff1a;构建简单实用的年份选择器&#xff08;简单原理示范&#xff09; 目录 效果预览&#xff1a; 一、 Excel准备与存放 1.1 …...

Sqli-labs靶场第18关详解[Sqli-labs-less-18]自动化注入-SQLmap工具注入

Sqli-labs-Less-18 通过测试发现&#xff0c;在登录界面没有注入点&#xff0c;通过已知账号密码admin&#xff0c;admin进行登录发现&#xff1a; 返回了User Agent&#xff0c;设想如果在User Agent尝试加上注入语句&#xff08;报错注入&#xff09;&#xff0c;测试是否会…...

【测开求职】2023秋招快手一面面经

已经过了百度测开三面,快手这个一面比百度的要难很多,可能也是遇到了比较严格的面试官,感觉其他面经没有这么难。30分钟实习,20分钟算法题,20分钟八股,没有问项目。 实习 diff遇到了哪些痛点diff是全量还是增量一些字段的增加或者枚举值的增加可以用diff测吗有哪些自动化…...

【Go语言】Go语言中的字典

Go语言中的字典 字典就是存储键值对映射关系的集合&#xff0c;在Go语言中&#xff0c;需要在声明时指定键和值的类型&#xff0c;此外Go语言中的字典是个无序集合&#xff0c;底层不会按照元素添加顺序维护元素的存储顺序。 如下所示&#xff0c;Go语言中字典的简单示例&…...

Matlab 机器人工具箱 创建机器人

文章目录 1 创建机器人的几种方法1.1 方法11.2 方法21.3 方法31.4 方法41.5 方法51.6 方法6 2 定义Link属性3 查看Link属性 1 创建机器人的几种方法 1.1 方法1 % theta d a alpha sigma >> L1Link([0 1 0.5 0 0],standard)L1 Revolute(std): thetaq, d1, a0…...

跨平台指南:在 Windows 和 Linux 上安装 OpenSSL 的完整流程

Windows安装 一&#xff1a;找到安装包&#xff0c;双击即可 https://gitee.com/wake-up-again/installation-package.git 二&#xff1a;按照提示&#xff0c;一步一步来&#xff0c;就可以啦 三&#xff1a;此界面意思是&#xff0c;是否想向创作者捐款&#xff0c;自己视情…...

JAVA请求示例获取1688商品详情数据API接口item_get-获得阿里巴巴商品详情(按关键词搜索商品列表)

要获取1688&#xff08;阿里巴巴&#xff09;的商品详情数据&#xff0c;你需要使用阿里巴巴开放平台提供的API接口。与淘宝开放平台类似&#xff0c;你需要先在阿里巴巴开放平台注册账号&#xff0c;创建应用&#xff0c;并获取app_key和app_secret。然后&#xff0c;根据阿里…...

安卓手机安装termux、kali linux及基本配置

相关阅读&#xff1a;Termux 高级终端安装使用配置教程 | 国光 百度安全验证 该文安装的 kali liunx 应该是简易版的&#xff0c;没有相关工具 一、下载安装termux 建议通过 f-droid 应用市场下载链接termux&#xff0c;点击即直接下载。 二、配置termux 1.更换镜像源 te…...

Python 实现海康机器人工业相机 MV-CS050-10GC 的实时显示视频流及拍照功能(实时显示视频流同时可以进行拍照)

参考链接&#xff1a; https://www.cnblogs.com/HanYork/p/17388506.html https://www.cnblogs.com/miracle-luna/p/16960556.html#5138211 Flask搭建流媒体服务器&#xff1a;使用Flask搭建一个流媒体服务器_multipart/x-mixed-replace; boundaryframe-CSDN博客...

武器大师——操作符详解(下)

目录 六、单目操作符 七、逗号表达式 八、下标引用以及函数调用 8.1.下标引用 8.2.函数调用 九、结构体 9.1.结构体 9.1.1结构的声明 9.1.2结构体的定义和初始化 9.2.结构成员访问操作符 9.2.1直接访问 9.2.2间接访问 十、操作符的属性 10.1.优先性 10.2.结合性 …...

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:Popup控制)

给组件绑定popup弹窗&#xff0c;并设置弹窗内容&#xff0c;交互逻辑和显示状态。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 popup弹窗的显示状态在onStateChange事件回调中反馈&#xff0c;其显…...

Python系列(20)—— 排序算法

Python中的排序算法 一、引言 排序算法是计算机科学中的基本算法之一&#xff0c;用于将一组数据按照特定的顺序进行排列。Python提供了多种排序算法的实现&#xff0c;包括内置的排序函数和手动实现的排序算法。本文将介绍几种常见的排序算法&#xff0c;并通过代码实例来展…...

DS3232 Arduino轻量RTC库:嵌入式时间管理与I²C优化实践

1. DS3232 Arduino库深度解析&#xff1a;面向嵌入式工程师的精简型RTC驱动实践指南1.1 库定位与工程设计哲学DS3232 Arduino库是一个专为嵌入式实时系统优化的轻量级IC实时时钟&#xff08;RTC&#xff09;驱动&#xff0c;其核心设计目标并非功能堆砌&#xff0c;而是在资源受…...

SpringBoot3.0.0实战:5分钟搞定SpringDoc与Knife4j的完美集成(含中文UI配置)

SpringBoot3.0极速集成SpringDoc与Knife4j&#xff1a;中文文档界面实战指南 在微服务架构盛行的当下&#xff0c;API文档的规范化和可视化已成为项目开发中不可或缺的一环。对于使用SpringBoot3.0的Java开发者来说&#xff0c;SpringDoc与Knife4j的组合堪称API文档工具链中的黄…...

【限时开源】:我们刚交付的三级医院FHIR适配引擎源码(C#/.NET 6+),含动态Profile加载、术语服务桥接、差量同步模块——仅开放72小时

第一章&#xff1a;FHIR适配引擎在三级医院信息系统的战略定位与开源意义FHIR适配引擎并非简单的协议转换中间件&#xff0c;而是三级医院实现跨系统互操作、支撑国家健康医疗大数据平台对接、满足《医疗卫生机构网络安全管理办法》与《电子病历系统功能应用水平分级评价标准》…...

DMA技术解析:提升嵌入式系统性能的关键

1. DMA技术概述&#xff1a;解放CPU的搬运工 DMA&#xff08;Direct Memory Access&#xff09;直接存储器访问技术&#xff0c;是现代嵌入式系统中提升性能的关键设计。我第一次在STM32项目中使用DMA传输时&#xff0c;实测发现ADC采样率从500kHz提升到2.1MHz&#xff0c;CPU占…...

数字后端 | Innovus 中解决 Congestion 的常用方法

前言 Congestion&#xff08;布线拥塞&#xff09;是数字后端实现中常见的问题。当局部区域标准单元过密、pin 密度过高或走线方向冲突时&#xff0c;就会出现 Congestion&#xff0c;最终可能导致 DRC 违例增多甚至布线失败。本文介绍在 Innovus 中如何查看和分析 Congestion&…...

汇川AM402 PLC控制IS620N伺服:手把手教你封装自己的轴控功能块(附完整工程)

汇川AM402 PLC控制IS620N伺服&#xff1a;从零封装轴控功能块的工程实践 在工业自动化项目中&#xff0c;伺服控制是最基础也最频繁使用的功能之一。想象一下&#xff0c;你正在开发一个包装产线控制系统&#xff0c;需要同时管理十几台伺服电机——每台电机都需要重复编写使能…...

数据开发者的AI转型:大模型应用实录

1️⃣需求解析&辅助研发 这个功能其实很有意思&#xff0c;我们迭代了两期。 第一期&#xff0c;其实这个功能一开始设计的比较天马行空&#xff0c;就是直接给一个需求进来&#xff0c;然后直接给你开发好。但是研发了半个月叫停了&#xff0c;发现模型根本理解不了整个需…...

开源项目合规性警示:从PyWxDump案例看技术工具的法律边界

开源项目合规性警示&#xff1a;从PyWxDump案例看技术工具的法律边界 【免费下载链接】PyWxDump 删库 项目地址: https://gitcode.com/GitHub_Trending/py/PyWxDump 在开源技术快速发展的今天&#xff0c;开发者常常面临技术实现与法律合规的平衡难题。近期&#xff0c;…...

Matlab新手也能搞定的MFAC仿真:从侯忠生教授书上的例题4.1代码跑通说起

Matlab新手也能搞定的MFAC仿真&#xff1a;从侯忠生教授书上的例题4.1代码跑通说起 第一次接触无模型自适应控制&#xff08;MFAC&#xff09;时&#xff0c;很多人会被各种理论推导吓退。但作为工程师&#xff0c;我们更关心的是如何让代码跑起来&#xff0c;看到实际效果。本…...

掌握Vue 3日历组件实战:从业务场景到深度定制的全流程指南

掌握Vue 3日历组件实战&#xff1a;从业务场景到深度定制的全流程指南 【免费下载链接】fullcalendar-vue The official Vue 3 component for FullCalendar 项目地址: https://gitcode.com/gh_mirrors/fu/fullcalendar-vue 在现代Web应用开发中&#xff0c;Vue 3日历组件…...