【unity实战】事件(Event)的基本实战使用

文章目录

  • 最终效果
  • 前言
  • 一、素材
  • 二、角色金币交互
    • 1. 拾取金币
    • 2. 显示金币数UI
  • 完结

最终效果

在这里插入图片描述

前言

之前我们介绍过委托的用法,具体可以跳转:【unity小技巧】委托(Delegate)的基础使用和介绍

这期来讲讲事件,使用你会发现它和委托真的很像,那么他们具体有什么区别呢?

在Unity中,事件(Event)和委托(Delegate)是两种不同的概念,它们之间有一些区别:

  1. 委托(Delegate)

    • 委托是一种类型,用于引用一个或多个方法。委托可以看作是函数指针或函数的代理。
    • 委托用于实现回调函数、事件处理和方法的动态绑定。
    • 委托是一种类型安全的方式来封装方法调用。
  2. 事件(Event)

    • 事件是建立在委托之上的高级概念,它提供了一种更加简洁、安全的方式来实现观察者模式。
    • 事件使用委托来通知其他对象或类,当特定情况发生时,让它们执行相应的操作。
    • 事件可以通过“+=”(添加订阅者)和“-=”(移除订阅者)来管理委托的订阅和取消订阅。

何时使用事件和委托

  • 当需要实现一对多的消息传递时,可以使用事件。比如,当某个对象的状态发生变化时,需要通知多个其他对象做出相应的反应。
  • 当需要回调函数或方法引用时,可以使用委托。比如,当某个操作完成后需要执行特定的方法,可以使用委托来实现回调。

综合来说,事件和委托在Unity开发中都有各自的用途,根据具体情况选择合适的方式来实现功能会更加方便和有效。

一、素材

https://assetstore.unity.com/packages/2d/environments/pixel-art-top-down-basic-187605
在这里插入图片描述

二、角色金币交互

1. 拾取金币

金币事件,定义当金币增加时触发的事件

public class GoldEvents
{public event Action<int> onGoldGained; // 当金币增加时触发的事件public void GoldGained(int gold) {onGoldGained?.Invoke(gold); // 触发金币增加事件}
}

游戏事件管理中心,初始化各种事件

public class GameEventsManager : MonoBehaviour
{public static GameEventsManager instance { get; private set; } // 单例实例public GoldEvents goldEvents; // 金币事件private void Awake(){if (instance != null){Debug.LogError("在场景中找到多个游戏事件管理器"); // 如果场景中存在多个游戏事件管理器,则输出错误信息}instance = this; // 设置单例实例为当前实例// 初始化所有事件goldEvents = new GoldEvents(); // 初始化金币事件}
}

挂载脚本
在这里插入图片描述

管理玩家的金币,注册金币增加事件执行方法

// GoldManager类,负责管理玩家的金币
public class GoldManager : MonoBehaviour
{[Header("Configuration")]// 游戏开始时玩家拥有的金币数量[SerializeField] private int startingGold = 5;// 当前玩家持有的金币数量,外部只能获取不能设置public int currentGold { get; private set; }// 在对象被激活时调用,初始化玩家的金币数量private void Awake(){currentGold = startingGold;}// 注册事件监听器private void OnEnable() {// 当玩家获得金币时,注册GoldGained方法来处理事件GameEventsManager.instance.goldEvents.onGoldGained += GoldGained;}// 注销事件监听器private void OnDisable() {// 当对象被禁用时,取消注册GoldGained方法GameEventsManager.instance.goldEvents.onGoldGained -= GoldGained;}// 处理获得金币的事件private void GoldGained(int gold) {// 增加玩家的金币数量currentGold += gold;}
}

配置脚本
在这里插入图片描述

设置脚本执行顺序,在Unity的"Project Settings"中,你可以通过"Script Execution Order"设置脚本的执行顺序,确保GameEventsManager的Awake方法总是在其他依赖它的组件之前执行,不然可能会报错。
在这里插入图片描述

定义金币脚本,控制金币拾取和金币重新生成

[RequireComponent(typeof(CircleCollider2D))]
public class Coin : MonoBehaviour
{[Header("Config")][SerializeField] private float respawnTimeSeconds = 8; // 重生时间[SerializeField] private int goldGained = 1; // 获得的金币数量private CircleCollider2D circleCollider; // 圆形碰撞体private SpriteRenderer visual; // 视觉元素private void Awake() {// 初始化圆形碰撞体和视觉元素circleCollider = GetComponent<CircleCollider2D>();visual = GetComponentInChildren<SpriteRenderer>();}// 收集金币的方法private void CollectCoin() {circleCollider.enabled = false;visual.enabled = false;// 触发获得金币事件GameEventsManager.instance.goldEvents.GoldGained(goldGained);StopAllCoroutines();StartCoroutine(RespawnAfterTime());}// 在一定时间后重生金币private IEnumerator RespawnAfterTime(){yield return new WaitForSeconds(respawnTimeSeconds);circleCollider.enabled = true;visual.enabled = true;}// 触发进入触发器事件private void OnTriggerEnter2D(Collider2D otherCollider) {if (otherCollider.CompareTag("Player")){CollectCoin();}}
}

金币挂载脚本
在这里插入图片描述
运行效果
在这里插入图片描述
拾取金币后,currentGold加1,说明没问题
在这里插入图片描述

2. 显示金币数UI

一直查看金币变量数据变化,不是很方便,我们可以让金币数显示出来

修改GoldEvents,新增金币变化事件

public class GoldEvents
{//。。。public event Action<int> onGoldChange; // 当金币数量变化时触发的事件public void GoldChange(int gold) {onGoldChange?.Invoke(gold); // 触发金币变化事件}
}

新增GoldUI,注册金币数量发生变化时调用的方法

public class GoldUI : MonoBehaviour
{[Header("Components")]// 用于显示金币数量的TextMeshProUGUI组件[SerializeField] private TextMeshProUGUI goldText;// 在对象激活时注册事件监听器private void OnEnable() {// 当金币数量发生变化时,注册GoldChange方法来处理事件GameEventsManager.instance.goldEvents.onGoldChange += GoldChange;}// 在对象禁用时注销事件监听器private void OnDisable() {// 当对象被禁用时,取消注册GoldChange方法GameEventsManager.instance.goldEvents.onGoldChange -= GoldChange;}// 处理金币数量变化的事件private void GoldChange(int gold) {// 将金币数量转换为字符串,并更新UI显示goldText.text = gold.ToString();}
}

同样配置GoldUI 脚本执行顺序
在这里插入图片描述

挂载脚本
在这里插入图片描述
修改GoldManager,广播当前金币数量的改变事件

// 在第一帧更新之前调用,广播当前金币数量的改变
private void Start()
{GameEventsManager.instance.goldEvents.GoldChange(currentGold);
}// 处理获得金币的事件
private void GoldGained(int gold) 
{// 增加玩家的金币数量currentGold += gold;// 广播金币数量的变化GameEventsManager.instance.goldEvents.GoldChange(currentGold);
}

效果
在这里插入图片描述

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

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

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

相关文章

【SpringBoot3.x教程02】SpringBoot配置文件详解

前言&#xff1a;什么是配置文件 SpringBoot的配置文件是指用于定义和管理SpringBoot应用程序配置的文件。这些配置文件允许开发者调整和控制应用程序的行为&#xff0c;而无需改变代码。主要有两种格式的配置文件&#xff1a; 1、application.properties&#xff1a;这是一种使…

华金证券2024:以“芯”助先进算法,以“算”驱万物智能

本文选自“以芯助先进算法&#xff0c;以算驱万物智能”。 一、半导体景气度有望迎来复苏 从半导体行业景气度来看&#xff0c;在经历了2022、2023年的去库存周期 后&#xff0c;半导体销售额有望在2024年迎来复苏。据WSTS数据显示&#xff0c;全球半导体产品销售总额从1999 年…

OJ_一端进,两端出

题干 C实现 #include <stdio.h> #include <list> #include <vector>using namespace std;int main() {int n, k;scanf("%d%d", &n, &k);vector<int> insertVec(n);for (int i 0; i < n; i) {scanf("%d", &insert…

四、西瓜书——支持向量机

第六章 支持向量机 1.间隔与支持向量 支持向量机的原理是寻找与支持向量具有最大间隔的划分超平面。支持向量机具有一个重要性质: 训练完成后,大部分的训练样本都不需保留,最终模型仅与支持向量有关. 首先&#xff0c;超平面的方程为&#xff1a; 点到超平面的距离为&#xff…

单表练习12.0

一个学生表 分别记录姓名&#xff0c;年龄&#xff0c;性别&#xff0c;班级&#xff0c;语文&#xff0c;数学&#xff0c;英语字段 create table student2( id int primary key , name char(20), sex char(10), age int(3), mobile char(20), class char(10), engli…

男子失眠焦虑、胸闷气短发作,多次跑医院,检查结果却显示无异常!

植物神经紊乱指的是人体内部的自主神经系统失去平衡&#xff0c;导致一系列的生理和心理方面的异常状态。人体的自主神经系统分为交感神经系统和副交感神经系统&#xff0c;它们共同调节心血管系统、消化系统、呼吸系统、内分泌系统等器官的功能。当这两个系统的平衡被打破&…

IPSEC---VPN

文章目录 目录 文章目录 一.TCP/IP 协议的缺点 二.IPsec诞生背景 IPsec可提供安全服务 三.IPsec协议簇 IPsec的两种工作模式 传输模式 隧道模式&#xff1a; IPsec的安全协议 AH 协议:鉴别头协议 ESP协议&#xff1a;封装安全载荷协议 AH与ESP对比 AHESP报文&#xff1a…

【Python】Python注册微服务到nacos

Python注册微服务到Nacos 1.Nacos部署 github 的nacos项目的发布页&#xff08;Releases alibaba/nacos GitHub &#xff09;&#xff0c;选择所要下载的nacos版本&#xff0c;在nacos下方的assets中选择安装包进行下载。 解压nacos安装包到指定目录。 tar -zxvf nacos-ser…

国产通讯芯片D3232介绍,要用于工控主板、工业控制器、程序烧录下载器、仿真器、新能源充电桩等众多涉及RS232通讯的产品

一、应用领域 D3232芯片主要用于工控主板、工业控制器、程序烧录下载器、仿真器、新能源充电桩等众多涉及RS232通讯的产品。 二、基本特性 D3232芯片由两个线路驱动器、两个线路接收器和双电荷泵电路组成&#xff0c;具有HBM>15kV、CDM>2kV的ESD保护能力&#xff0c;并且…

element-ui plus v2.60 终于修复了 radio checkbox 取值不明确的问题,label value 值

element-ui plus v2.60 终于修复了 radio checkbox 取值不明确的问题&#xff0c;label value 值 昨天想反馈这个关于 label 和 value 的问题的时候&#xff0c;发现新版本已经修正这个问题了。 一、ElementUI 旧版关于 label 和 value 的问题 从之前 element-ui 用过来的&a…

两天学会微服务网关Gateway-Gateway网关限流

锋哥原创的微服务网关Gateway视频教程&#xff1a; Gateway微服务网关视频教程&#xff08;无废话版&#xff09;_哔哩哔哩_bilibiliGateway微服务网关视频教程&#xff08;无废话版&#xff09;共计17条视频&#xff0c;包括&#xff1a;1_Gateway简介、2_Gateway工作原理、3…

Sublime Text 格式化Json文件 之 Pretty Json

需要使用到 Pretty Json插件。 一、安装方法 sublime 下&#xff0c;按快捷键 Comand control p&#xff0c; 输入install Package,然后回车 等几秒钟&#xff0c;加载启动进程完毕后弹出的页面中输入pretty json, 然后回车 等待几秒钟&#xff0c;可以查看Sublime 最下面的…

HUAWEI 华为交换机 配置 MAC 防漂移 防MAC伪造示例

组网需求 某企业网络中&#xff0c;用户需要访问企业的服务器。如果某些非法用户从其他接口假冒服务器的MAC 地址发送报文&#xff0c;则服务器的 MAC 地址将在其他接口学习到。这样用户发往服务器的报文就会发往非法用户&#xff0c;不仅会导致用户与服务器不能正常通信&…

【粉丝福利】一本书讲透ChatGPT,实现从理论到实践的跨越!大模型技术工程师必读

&#x1f33c;一、前言 OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景&#xff0c;在多项专业和学术基准测试中表现出的智力水平&#xff0c;不仅接近甚至有时超越了人类的平均水平。这使得 ChatGPT 在推出之初就受到广大用户的欢迎&#xf…

在Windows 10和11中打开事件查看器的11种方法,总有一种适合你

Windows事件查看器是一个功能强大的工具,可以记录电脑从启动到关机的所有过程。你可以使用它查看有关应用程序错误、不同系统服务生成的警告的详细信息,以及有关驱动程序和服务状态的信息。这就是为什么当你需要识别或解决计算机或设备上的问题时,Windows 11和Windows 10事件…

【金九银十】,架构师花费近一年时间整理出来的安卓核心知识

面试经历 主要是根据回忆总结的&#xff08;会有遗漏点&#xff09;。 1. 腾讯&#xff08;QQ音乐&#xff09; 腾讯面试涉及到的范围也很广&#xff0c;甚至问到了C、Kotlin Flutter &#xff0c;也具有一定挑战性的&#xff0c;以下包括腾讯腾讯安卓客户端三面&#xff0c…

国创证券|降准对股市的影响,利好哪些板块?

降准是指央行下调金融机构存款准备金率&#xff0c;是一种宽松的钱银政策&#xff0c;会添加社会上的流动资金&#xff0c;然后推动股市上涨&#xff0c;对股市来说是一种利好&#xff0c;其间利好以下板块&#xff1a; 1、利好房地产板块 央行降准会进步银行可贷资金&#x…

每日一题-链表的中间结点

&#x1f308;个人主页: 会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 上面是解题题目&#xff1a; 解题思路&#xff1a;快慢指针法--慢指针一次指向下一个&#xff0c;快指针一次指向下两个 解答过程&#xff1a; /*** Definition for singly-linked…

Linux学习-指针与数组

目录 数组和指针的关系 数组指针&#xff1a; 数组和指针的关系代码 指针数组 指针和二维数组的关系 数组传参 数组和指针的关系 一维数组和指针的关系&#xff1a; int a[5] {1,43,5,3,2,}; 数组的数组名a是指向数组第一个元素a[0]的指针常量&#xff1b; a &a…

JRebel and XRebel 插件在IDEA中的安装、激活和使用

1、JRebel安装 1、打开idea->setting->plugins->Marketplace 2、搜索插件JRebel and XRebel&#xff0c;点击安装&#xff0c;然后重启idea 如果左侧出现JRebel & XRebel代表已安装 3.离线安装JRebel 根据自己安装的idea版本进行下载电影的jrebel https://plugi…