【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;这是一种使…

主流开发环境和开发语言介绍

主流开发环境和开发语言介绍 一、主流开发环境介绍 主流开发环境是指广泛应用于软件开发的集成开发环境&#xff08;Integrated Development Environment&#xff0c;简称IDE&#xff09;。IDE是一种集成了编辑器、编译器、调试器等工具的软件&#xff0c;提供了一站式的开发环…

华金证券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】(5)函数

def 函数名(参数1,参数2....):...reture 结果 #可以不返回def greet_user():"""显示简单的问候语"""print("hello") greet_user()参数 关键字参数 指定参数指向,如果不加关键字必须顺序一致 def greet_user(animal_type, pet_na…

【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;并且…

数仓开发-面试二

1.finebi使用 2.数据抽取中间件 flink,kettle flink和kettle区别 3.flink本身的优点和缺点 4.flink容错机制 5.DS 6.数据库 7.主要找orcle、clickhourse 8.mysql离线查作业执行计划&#xff0c;如&#xff0c;你写个sql500&#xff0c;这个时候你怎么定位问题&#xff0c;查看问…

Acwing---3768. 字符串删减

字符串删减 1.题目2.基本思想3.代码实现 1.题目 给定一个由 n个小写字母构成的字符串。 现在&#xff0c;需要删掉其中的一些字母&#xff0c;使得字符串中不存在连续三个或三个以上的 x。 请问&#xff0c;最少需要删掉多少个字母&#xff1f; 如果字符串本来就不存在连续…

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;不仅会导致用户与服务器不能正常通信&…

力扣:71. 简化路径

栈 1.思路&#xff1a;在栈中只要把 / 的下标进栈和出栈就可以计算字符串中的字母&#xff0c;获取字符串中的字母用substring&#xff08;&#xff09;函数根据 两个 / 的下标来确定区间。之后把符合的字母加入集合中。之后要判断值为“. ."时要删除集合中最后一个元素。…

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

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

Oracle存储过程干货(一):存储过程基础

/ SQLplus中&#xff0c;设置 set serveroutput on 才能显示输出结果 / —匿名的PLSQL(存储过程)块&#xff0c;不存储在数据库中 beginnull; end; /begindbms_output.put(hi ); /*put是不换行的输出*/dbms_output.put_line(hello world); /*put_line是换行的输出*/ end…