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

这篇具有很好参考价值的文章主要介绍了【unity实战】事件(Event)的基本实战使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最终效果

unity 事件,# unity实战,unity,游戏引擎,游戏

前言

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

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

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

  1. 委托(Delegate)

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

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

何时使用事件和委托

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

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

一、素材

https://assetstore.unity.com/packages/2d/environments/pixel-art-top-down-basic-187605
unity 事件,# unity实战,unity,游戏引擎,游戏

二、角色金币交互

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(); // 初始化金币事件
    }
}

挂载脚本
unity 事件,# unity实战,unity,游戏引擎,游戏

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

// 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 事件,# unity实战,unity,游戏引擎,游戏

设置脚本执行顺序,在Unity的"Project Settings"中,你可以通过"Script Execution Order"设置脚本的执行顺序,确保GameEventsManager的Awake方法总是在其他依赖它的组件之前执行,不然可能会报错。
unity 事件,# unity实战,unity,游戏引擎,游戏

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

[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();
        }
    }
}

金币挂载脚本
unity 事件,# unity实战,unity,游戏引擎,游戏
运行效果
unity 事件,# unity实战,unity,游戏引擎,游戏
拾取金币后,currentGold加1,说明没问题
unity 事件,# unity实战,unity,游戏引擎,游戏

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 脚本执行顺序
unity 事件,# unity实战,unity,游戏引擎,游戏

挂载脚本
unity 事件,# unity实战,unity,游戏引擎,游戏
修改GoldManager,广播当前金币数量的改变事件

// 在第一帧更新之前调用,广播当前金币数量的改变
private void Start()
{
    GameEventsManager.instance.goldEvents.GoldChange(currentGold);
}

// 处理获得金币的事件
private void GoldGained(int gold) 
{
    // 增加玩家的金币数量
    currentGold += gold;
    // 广播金币数量的变化
    GameEventsManager.instance.goldEvents.GoldChange(currentGold);
}

效果
unity 事件,# unity实战,unity,游戏引擎,游戏

完结

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

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

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

unity 事件,# unity实战,unity,游戏引擎,游戏文章来源地址https://www.toymoban.com/news/detail-852383.html

到了这里,关于【unity实战】事件(Event)的基本实战使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#__事件event的简单使用:工具人下楼问题

     // 工具人类 // 懒人类 // 调用运行

    2024年02月12日
    浏览(36)
  • 跟着cherno手搓游戏引擎【6】ImGui和ImGui事件

    下载链接: GitHub - TheCherno/imgui: Dear ImGui: Bloat-free Immediate Mode Graphical User interface for C++ with minimal dependencies  新建文件夹,把下载好的文件放入对应路径:  SRC下的premake5.lua文件:添加ImGui 在Platform下创建OpenGl,将imgui_impl_opengl3.cpp和.h加入到该文件夹。 并且更名: 150行改为:

    2024年01月17日
    浏览(41)
  • C#中的委托(Delegate)和事件 (Event)详解与使用范例

    最近天气晴雨不定,你因为害怕打游戏时忘记在下雨时收衣服或者在天晴时把衣服挂出去,于是你委托好友小明在天气发生变化时打电话通知你,这就是一种委托. 下面是这种委托的实例代码 以上代码的输出为 值得一提的是,如下代码为创建一个继承自Delegate类的名为XiaoMing的子类

    2023年04月12日
    浏览(42)
  • 跟着cherno手搓游戏引擎【4】窗口抽象、GLFW配置、窗口事件

    在vendor里创建GLFW文件夹: 在github上下载,把包下载到GLFW包下。 GitHub - TheCherno/glfw: A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input修改SRC/premake5.lua的配置:12、13、15、36、37、38、39、40行的代码是新加上去的: GLFW中的premake5.lua:  如出现此BUG:请找GLFW中的premake5文件,

    2024年01月21日
    浏览(43)
  • DOTS Unity.Physics物理引擎碰撞事件处理

    最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们给大家分享和介绍一下这个物理引擎的碰撞事件处理以及核心相关概念。 Unity.Physics 物理引擎的主要流程与P ipeline   Unity.Physics物理引擎做仿真迭代计算的时候主要通过以下步骤来执行:   

    2024年01月18日
    浏览(51)
  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(79)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(66)
  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(74)
  • Unity vs Godot :哪个游戏引擎更适合你?

    游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来,Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较,以期为开发者提供正确的选择建议。 Godot和Unity都有各自的优势,没有绝对的好坏之分。Godot开源免费,上手简单,更适合2D和小型游戏

    2024年01月23日
    浏览(98)
  • 【JS/TS游戏开发实战】LayaAir 全平台 3D 引擎

    LayaAir3.0引擎,包括引擎代码、项目开发工具、项目发布,三大部分。

    2024年02月07日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包