【unity小技巧】适用于任何 2d 游戏的钥匙门系统和buff系统——UnityEvent的使用
文章目录
- 每篇一句
- 前言
- 开启
- 配置门的开启动画
- 代码调用,控制开启门动画
- 新增CollisionDetector 脚本,使用UnityEvent ,控制钥匙和门的绑定
- 多把钥匙控制多个门
- 一把钥匙控制多个门
- BUFF系统
- 扩展
- 参考
- 源码
- 完结
每篇一句
人总是害怕去追求自己最重要的梦想,因为他们觉得自己不配拥有,或者觉得自己没有能力去完成。
——保罗柯艾略《牧羊少年奇妙之路》
前言
当开发2D游戏时,钥匙门系统和buff系统是常见的游戏机制。当开发2D游戏时,钥匙门系统和buff系统是常见的游戏机制。如果让你开发一个钥匙门系统,你的想法可能是写个钥匙控制脚本,再写个门脚本控制开门,当人物触碰钥匙然后调用对应的门代码,打开对应的门,这样做无疑是没什么问题的,但是当要扩展一个钥匙打开多门,或者不同钥匙打开不同门的情况,系统的扩展性和可读性就会变得很差。而这里我分享一种方法,使用UnityEvent实现这些系统。
UnityEvent是Unity引擎提供的事件系统,它允许我们在游戏中定义和触发自定义事件,并与之相关联的回调函数。使用UnityEvent,我们可以轻松地创建灵活的、可扩展的钥匙门系统和buff系统,为游戏增添深度和变化。
首先,使用UnityEvent可以实现高度的可定制性。我们可以设计各种类型的事件,并创建相应的回调函数来响应这些事件。例如,在钥匙门系统中,我们可以创建一个UnityEvent来表示玩家获得了一把钥匙,然后将该事件与门的解锁方法关联起来。这样,只要玩家获得了钥匙,门就会自动解锁。通过这种方式,我们可以根据游戏需要定义任意数量的事件和回调,从而创建出独特而富有挑战性的游戏玩法。
其次,UnityEvent提供了良好的可扩展性。由于UnityEvent是基于委托的,我们可以方便地增加或删除事件的监听器。这使得我们能够轻松地扩展钥匙门系统和buff系统的功能。例如,在buff系统中,我们可以在玩家获得一个新的buff时,通过UnityEvent通知其他相关系统进行相应处理,如调整玩家属性、触发特效等。通过添加和移除事件监听器,我们可以根据游戏的需求动态修改系统的行为,使其更加灵活和可定制。
此外,使用UnityEvent还能提高项目的可维护性和可读性。通过将事件和回调函数封装在UnityEvent中,我们可以将相关逻辑集中在一起,使代码更加清晰易懂。同时,当需要修改或扩展系统时,我们只需关注UnityEvent的定义和调用,而不必修改大量散落在代码中的具体实现。这种解耦合的设计有助于减少bug的引入,并提高代码的可维护性。
总而言之,使用UnityEvent可以极大地简化钥匙门系统和buff系统的开发过程,使其更具灵活性、可扩展性和可读性。通过合理地利用UnityEvent,我们能够快速实现复杂的游戏机制,并为玩家带来丰富多样的游戏体验。接下来,让我们深入了解如何利用UnityEvent来构建出色的钥匙门系统和buff系统吧!
开启
配置门的开启动画

代码调用,控制开启门动画
using UnityEngine;public class Door : MonoBehaviour
{private Animator _animator;private void Awake(){_animator = GetComponent<Animator>();}// 菜单选项,用于在编辑器中手动调用Open方法[ContextMenu(itemName: "Open")]public void Open(){_animator.SetTrigger("Open");}
}
效果

新增CollisionDetector 脚本,使用UnityEvent ,控制钥匙和门的绑定
using UnityEngine;
using UnityEngine.Events;public class CollisionDetector : MonoBehaviour
{[SerializeField]private string _colliderScript;[SerializeField]private UnityEvent _collisionEntered;[SerializeField]private UnityEvent _collisionExit;// 当其他物体进入碰撞时调用的方法private void OnCollisionEnter2D(Collision2D col){if (col.gameObject.GetComponent(_colliderScript)){_collisionEntered?.Invoke();}}// 当其他物体离开碰撞时调用的方法private void OnCollisionExit2D(Collision2D col){if (col.gameObject.GetComponent(_colliderScript)){_collisionExit?.Invoke();}}
}
绘制门和钥匙

挂载代码

效果

多把钥匙控制多个门
新增代码,控制修改钥匙颜色,对应门颜色也跟着改
using System;
using System.Collections.Generic;
using UnityEngine;public class ColorAligner : MonoBehaviour
{[SerializeField]private Color _color;[SerializeField]private List<SpriteRenderer> _renderersToAlign;// 在编辑器中修改字段值时自动调用的方法private void OnValidate(){// 遍历_renderersToAlign列表,并将每个SpriteRenderer的颜色设置为_color字段的值_renderersToAlign.ForEach((SpriteRenderer sp) =>{sp.color = _color;});}
}
配置

效果

一把钥匙控制多个门
绘制场景

配置参数


效果

BUFF系统
都看到这里了,buff系统的实现就不用多说了吧,同理即可
比如
using UnityEngine;public class Buff : MonoBehaviour
{public void AddHealth(){Debug.Log("加血");}public void AddSpeed(){Debug.Log("加速");}//TODO: 其他BUff
}
拾取每个buff物品时,执行对应的效果方法即可,是不是很简单?
扩展
你还可以将他扩展用到其他功能上,比如陷阱,触发对话,打开宝箱等等
参考
【视频】https://www.youtube.com/watch?app=desktop&v=1IJmenD1HOk
源码
为了防止大家变懒,源码就不提供了,大家直接可以照着文章思路进行学习
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。点赞越多,更新越快哦!当然,如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
好了,我是向宇,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

相关文章:
【unity小技巧】适用于任何 2d 游戏的钥匙门系统和buff系统——UnityEvent的使用
文章目录 每篇一句前言开启配置门的开启动画代码调用,控制开启门动画 新增CollisionDetector 脚本,使用UnityEvent ,控制钥匙和门的绑定多把钥匙控制多个门一把钥匙控制多个门 BUFF系统扩展参考源码完结 每篇一句 人总是害怕去追求自己最重要…...
爬虫ip如何加入到代码里实现自动化数据抓取
以下是一个使用HTTP:Tiny和www.weibo.com的音频爬虫程序的示例。这个示例使用了https://www.duoip.cn/get_proxy来获取爬虫IP。请注意,这个示例可能需要根据你的实际需求进行调整。 #!/usr/bin/perluse strict; use warnings; use HTTP::Tiny; use LWP::UserAgent; …...
在win10上安装配置Hadoop的环境变量
一、背景 在windows10系统中运行seatunnel 二、安装部署 2.1. 下载 Hadoop包 从 Apache Hadoop 官网下载最新版本的 Hadoop,版本号保持与服务端的Hadoop版本一致。 https://hadoop.apache.org/releases.htmlIndex of /apache/hadoop/core/hadoop-3.2.3/ 2.2. 解…...
MAX插件CG Magic怎么云渲染?操作方法已整起!
小编这里会收到不少网友的反馈是关于3ds max插件CG Magic怎么云渲染? 3d max的这款插件CG MAGIC的出现就是为了设计师使用过程中,可以省时又省心的完成工作。 同时,大家要了键下,现阶段CG MAGIC有18个板块,118个模块…...
尝试使用jmeter-maven-plugin
前提准备 1、maven项目 2、已安装JMeter、Jenkins、maven、jdk 环境要求: jmeter>5.6.2 maven >3.9 jdk>1.8 Jenkins ? 备注:jmeter-maven-plugin 无需下载,可查阅相关地址:GitHub - jmeter-maven-plugin/jmete…...
navigator.userAgent.toLowerCase区分设备,浏览器
navigator.userAgent.toLowerCase区分设备,浏览器 navigator.userAgent.toLowerCase()区分设备是pc还是移动端在确认是移动端的基础上,判断是Android、ipad、iphone内置的浏览器,比如新浪微博、腾讯QQ(非QQ浏览器&…...
防火墙操作:开放端口ICMP时间戳请求漏洞修复
响应ICMP时间戳请求漏洞修复 firewall-cmd --permanent --zonepublic --add-icmp-blocktimestamp-reply firewall-cmd --permanent --zonepublic --add-icmp-blocktimestamp-request firewall-cmd --reload --防火墙状态 systemctl status firewalld --打开防火墙 systemctl …...
MySQL配置环境变量和启动登录
如果不配置环境变量,每次登录 MySQL 服务器时就必须进入到 MySQL 的 bin 目录下,也就是输入“cd C:\Program Files\MySQL\MySQL Server 5.7\bin”命令后,才能使用 MySQL 等其它命令工具,这样比较麻烦。配置环境变量以后就可以在任…...
救济金发放(The Dole Queue, UVa 133)rust解法
n(n<20)个人站成一圈,逆时针编号为1~n。有两个官员,A从1开始逆时针数,B从n开始顺时针数。在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能两个官员停在同一个人上)…...
oracle实验四
创建文件 (1)为 ORCL 数据库创建一个名为 BOOKTBS1 的永久性表空间,数据文件为’d:\bt01.dbf’ ,大小为100M,区采用自动扩展方式(即自动分配), 段采用自动管理方式; &am…...
数据结构-堆排序Java实现
目录 一、引言二、算法步骤三、原理演示步骤1: 构建最大堆步骤2: 交换和堆化步骤3: 排序完成 四、代码实战五、结论 一、引言 堆排序是一种利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或…...
C#进阶——反射(Reflection)
定义:反射指的是在运行时动态地获取、检查和操作程序中的类型信息,而在我们的Unity中反射允许开发者在运行时通过代码来访问和修改对象的属性、方法和字段,而不需要提前知道这些成员的具体信息。 举一个例子,我们使用反射在运行的…...
Oracle 运维篇+应用容器数据库的install、upgrade、patch、uninstall
★ 知识点 ※ DEFAULT_SHARING参数的取值 METADATA: 元数据链接共享数据库对象的元数据,但其数据对于每个容器是唯一的。这些数据库对象被称为元数据链接的应用程序公共对象。此设置为默认设置。DATA: 数据链接共享数据库对象,其数据对于应用程序容器中…...
Affinity Publisher for Mac/Windows最新中文下载 排版神器
Affinity Publisher是一款专业的排版和设计软件,它可以帮助您从简单的文档到复杂的书籍和杂志轻松创建高质量的出版物。 该软件具有直观的界面和强大的功能,使您可以轻松组织和编辑文本、图像和数据,并创建令人惊叹的布局。 Affinity Publi…...
Mac文件对比同步工具 Beyond Compare 4.4.7
Beyond Compare 4 是一款强大的文件和文件夹比较工具。它提供了一个直观的界面,使您可以快速比较和同步文件和文件夹。 Beyond Compare 4 具有许多有用的功能,包括比较和合并文件、文件夹和压缩文件,以及同步文件和文件夹。它支持各种类型的文…...
技巧 | 如何解决 OBS 系统声音无法捕获问题 | Mac
技巧 | 如何解决 OBS 系统声音无法捕获问题 | Mac 问题描述 由于 macOS 系统限制,桌面音频被禁止,导致在使用 OBS 无法录制桌面音频,只能使用自带麦克风录制。 解决方法 Loopback 介绍 借助 Loopback 的强大功能,可以轻松地…...
从头开始机器学习:逻辑回归
一、说明 本篇实现线性回归的先决知识是:基本线性代数,微积分(偏导数)、梯度和、Python (NumPy);从线性方程入手,逐渐理解线性回归预测问题。 二、逻辑回归简介 我们将以我们在线性回…...
插入排序 算法
从第二个开始,从后面往前找,如果比其小,就交换,else 就终止 for i 1 i <n i for j i j > 0 (到第二个) j-- if < swap 下面给出源码 //对插入排序来说,直接从第二个元素开始template<ty…...
“揭秘!如何通过京东商品详情接口轻松获取海量精准商品信息!“
京东商品详情接口可以通过HTTP GET请求获取商品详情信息。 请求参数包括num_iid,表示JD商品ID。 请求示例: GET /jd/item_get/?num_iid10335871600 HTTP/1.1 Host: api-vx.Taobaoapi2014.cn Connection: close Accept-Encoding: gzip 点击获取…...
已经有多人中招,不要被AI换脸技术骗了!
您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。 💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
