【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从入门到精…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...