当前位置: 首页 > article >正文

Unity事件系统实战:用事件驱动重构你的金币拾取逻辑(告别硬编码)

Unity事件系统实战用事件驱动重构你的金币拾取逻辑告别硬编码在游戏开发中我们经常会遇到这样的场景玩家拾取金币后需要更新UI、播放音效、解锁成就、保存数据……如果把这些逻辑全部写在金币拾取的代码里很快就会变成一团乱麻。本文将带你用Unity的事件系统彻底重构这种硬编码模式实现真正的模块化解耦。1. 为什么我们需要事件驱动架构硬编码的直接调用就像在一家餐厅里厨师不仅要负责做饭还要亲自上菜、收银、打扫卫生。而事件系统则像现代化的餐厅分工——厨师只需专注烹饪其他工作由专门的服务员、收银员和清洁工完成。直接调用的典型问题代码臃肿一个CollectCoin()方法可能包含UI更新、音效播放、成就检查等十余行代码难以维护修改UI逻辑需要动金币脚本违反单一职责原则扩展困难新增功能如存档系统必须修改核心逻辑测试复杂无法单独测试某个功能模块事件驱动的核心优势// 传统硬编码方式 void CollectCoin() { currentGold; UpdateUI(); PlaySound(); CheckAchievement(); SaveData(); // 每新增一个功能就要修改这里 } // 事件驱动方式 void CollectCoin() { currentGold; goldEvents.OnGoldChanged(currentGold); // 只负责触发事件 }2. 构建事件系统的三大核心组件2.1 事件定义中心创建GameEvents.cs作为全局事件中心使用静态类实现无需实例化的访问public static class GameEvents { // 金币相关事件 public static event Actionint OnGoldChanged; public static void RaiseGoldChanged(int amount) OnGoldChanged?.Invoke(amount); // 成就事件 public static event ActionAchievementType OnAchievementUnlocked; public static void RaiseAchievementUnlocked(AchievementType type) OnAchievementUnlocked?.Invoke(type); // 音效事件 public static event ActionSoundType OnSoundPlay; public static void RaiseSoundPlay(SoundType type) OnSoundPlay?.Invoke(type); }提示使用静态事件要注意在场景切换时取消订阅避免内存泄漏2.2 事件触发方Producer改造金币拾取脚本使其只负责核心逻辑和事件触发public class Coin : MonoBehaviour { [SerializeField] int goldValue 1; void OnTriggerEnter(Collider other) { if (!other.CompareTag(Player)) return; DisableVisual(); GameEvents.RaiseGoldChanged(goldValue); GameEvents.RaiseSoundPlay(SoundType.CoinPickup); StartCoroutine(RespawnAfter(8f)); } void DisableVisual() { GetComponentCollider().enabled false; GetComponentInChildrenRenderer().enabled false; } }2.3 事件监听方Consumer各模块独立响应事件互不干扰UI系统示例public class GoldUI : MonoBehaviour { [SerializeField] TextMeshProUGUI goldText; void OnEnable() { GameEvents.OnGoldChanged UpdateUI; } void OnDisable() { GameEvents.OnGoldChanged - UpdateUI; } void UpdateUI(int amount) { goldText.text $Gold: {amount}; // 可以添加金币变化动画等效果 } }成就系统示例public class AchievementSystem : MonoBehaviour { void OnEnable() { GameEvents.OnGoldChanged CheckGoldAchievements; } void OnDisable() { GameEvents.OnGoldChanged - CheckGoldAchievements; } void CheckGoldAchievements(int totalGold) { if (totalGold 100) GameEvents.RaiseAchievementUnlocked(AchievementType.GoldCollector); } }3. 高级事件模式实战3.1 事件参数封装当需要传递复杂数据时使用自定义事件参数类public class GoldEventArgs : EventArgs { public int Amount { get; } public Vector3 PickupPosition { get; } public GameObject Picker { get; } public GoldEventArgs(int amount, Vector3 pos, GameObject picker) { Amount amount; PickupPosition pos; Picker picker; } } // 在事件中心添加 public static event EventHandlerGoldEventArgs OnAdvancedGoldChanged;3.2 事件优先级控制通过注册顺序控制事件处理优先级void OnEnable() { // 确保存档系统最先响应 GameEvents.OnGoldChanged SaveSystem.HandleGoldChanged GameEvents.OnGoldChanged; }3.3 防止事件滥用设置事件触发频率限制public class SoundSystem : MonoBehaviour { float lastPlayTime; void HandleSoundEvent(SoundType type) { if (Time.time - lastPlayTime 0.1f) return; PlaySound(type); lastPlayTime Time.time; } }4. 性能优化与调试技巧4.1 事件系统性能对比方案内存占用执行效率适用场景静态事件低高全局系统事件单例事件中心中中需要实例化管理的场景ScriptableObject事件高低配置驱动型项目4.2 事件调试工具创建事件监视器窗口#if UNITY_EDITOR [CustomEditor(typeof(GameEventTester))] public class GameEventTesterEditor : Editor { public override void OnInspectorGUI() { if (GUILayout.Button(模拟金币事件)) { GameEvents.RaiseGoldChanged(10); } } } #endif4.3 常见问题排查问题1事件没有触发检查订阅时机OnEnable比Start更可靠验证事件不为null使用?.Invoke语法查看脚本执行顺序问题2内存泄漏确保所有OnEnable订阅都有对应的OnDisable取消使用WeakReference实现自动取消订阅模式public class WeakEvent { ListWeakReferenceAction listeners new ListWeakReferenceAction(); public void AddListener(Action handler) { listeners.Add(new WeakReferenceAction(handler)); } public void Invoke() { for(int i listeners.Count-1; i 0; i--) { if(listeners[i].TryGetTarget(out var handler)) { handler?.Invoke(); } else { listeners.RemoveAt(i); } } } }5. 架构演进从事件到消息总线当项目规模扩大时可以考虑升级到更完善的消息系统public static class MessageBus { static DictionaryType, Delegate handlers new DictionaryType, Delegate(); public static void SubscribeT(ActionT handler) where T : IMessage { handlers[typeof(T)] Delegate.Combine(handlers.GetValueOrDefault(typeof(T)), handler); } public static void PublishT(T message) where T : IMessage { if (handlers.TryGetValue(typeof(T), out var del)) { (del as ActionT)?.Invoke(message); } } } // 使用示例 public struct GoldMessage : IMessage { public int Amount; public Vector3 Position; } // 发布 MessageBus.Publish(new GoldMessage { Amount 10 }); // 订阅 MessageBus.SubscribeGoldMessage(msg { // 处理消息 });这种架构下各系统完全解耦甚至可以实现跨程序集通信特别适合大型项目开发。

相关文章:

Unity事件系统实战:用事件驱动重构你的金币拾取逻辑(告别硬编码)

Unity事件系统实战:用事件驱动重构你的金币拾取逻辑(告别硬编码)在游戏开发中,我们经常会遇到这样的场景:玩家拾取金币后,需要更新UI、播放音效、解锁成就、保存数据……如果把这些逻辑全部写在金币拾取的代…...

Spring Security OAuth2 /oauth/token 401原因与Content-Type规范

1. 问题现场还原:一个看似简单却让开发停摆两小时的/oauth/token请求刚接手一个老项目做安全加固,第一件事就是验证OAuth2密码模式的token获取流程。我照着文档写了一条curl命令:curl -X POST http://localhost:8080/oauth/token回车执行&…...

FairyGUI Unity鼠标悬停与点击对象获取原理与实战

1. 这不是“加个OnMouseEnter就能用”的事:FairyGUI在Unity中处理鼠标交互的真实困境很多人第一次在Unity里集成FairyGUI,想实现“鼠标悬停显示提示”或“点击高亮当前按钮”,下意识就去翻Unity的MonoBehaviour文档,找OnMouseEnte…...

终极键盘重映射解决方案:3分钟实现职业级游戏操作精度

终极键盘重映射解决方案:3分钟实现职业级游戏操作精度 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 在激烈的游戏对抗中,你是否曾因键盘按键冲突而错失关键操作?当同时按下…...

CPU架构启发的智能仓储布局优化实践

1. 仓库布局优化的核心挑战与创新机遇在物流仓储领域,拣货环节通常占据运营成本的55%-65%,而其中约50%的时间消耗在无效行走路径上。传统矩形仓库布局虽然易于规划和施工,但其正交的通道设计导致拣货员需要频繁进行90度转向,这种&…...

基于随机森林的低成本传感器机器学习校准实践指南

1. 项目概述:当低成本传感器遇上机器学习校准在物联网和智能感知系统铺天盖地的今天,低成本传感器几乎无处不在。从监测办公室的空气质量,到追踪城市街道的噪音污染,再到农业大棚里的温湿度控制,这些价格亲民的“小眼睛…...

机器学习驱动储氢材料发现:从特征工程到DFT/MD验证的完整指南

1. 项目概述与核心思路氢能被视为未来清洁能源体系的关键一环,但如何安全、高效、经济地储存氢气,一直是制约其大规模应用的瓶颈。在众多储氢技术路线中,固态储氢,特别是基于金属氢化物的储氢材料,因其高体积储氢密度和…...

论文润色深度测评:GPT-5.5 + Gemini 3.1 Pro:教你学会1+1>2的论文润色方法

各位同仁好,我是七哥。一个在高校里从事人工智能相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude等大模型学术实操相关问题,多多交流,相互成就,共同进步。 2026年的科研圈,AI工具的选择已经从有没有变成了强不强,七哥评测了GPT…...

告别硬编码!在UE5.1里用蓝图动态配置MySQL连接参数(控件蓝图实战)

动态配置MySQL连接:UE5.1控件蓝图的工程化实践在游戏开发中,数据库连接往往是项目架构中不可或缺的一环。传统硬编码方式虽然简单直接,却带来了维护困难、安全性差、灵活性低等一系列问题。本文将深入探讨如何在UE5.1中构建一个完全动态化的M…...

破解材料数据荒:合成数据与随机森林预测聚合物阻燃性能

1. 项目概述与核心挑战在材料研发领域,尤其是涉及公共安全的聚合物阻燃性研究,传统实验方法正面临巨大瓶颈。想象一下,你是一位材料工程师,需要设计一种用于高铁内饰或高层建筑电缆护套的新型聚合物,其阻燃性能必须满足…...

口碑最好的AI论文写作工具推荐(从文献整理到论文成稿全流程)适合全体毕业生

还在为选题方向纠结、文献资料翻找耗时、开题报告无从下手、论文框架反复修改、查重率居高不下、降重过程痛苦不堪,甚至答辩PPT还要临时抱佛脚?作为学术新手、应届生或本科硕士毕业生,面对论文写作的重重关卡,流程复杂、操作门槛高…...

AI率总超标?2026年AI写作辅助网站排行榜权威发布,轻松定稿不是梦!

写论文效率低、熬夜赶稿、查重不过关?别慌!2026 年最新 AI 论文写作工具合集来了,覆盖选题、大纲、初稿、润色、降重、格式、文献引用全流程,帮你精准匹配最适合的学术助手,彻底告别论文内耗!🏆…...

差分隐私GDP机制紧密度量化:从隐私剖面到∆度量的实践指南

1. 差分隐私GDP机制:从理论到实践,如何量化隐私保护紧密度在差分隐私(Differential Privacy, DP)的实际部署中,尤其是在机器学习的隐私保护训练(如DP-SGD)场景里,我们常常面临一个核…...

PCL 基于强度的双边滤波【2026最新版】

目录 一、算法原理 1、计算步骤 2、算法源码 3、函数解析 4、参考文献 二、代码实现 三、结果展示 四、滤波后未发生变化的原因 五、解决办法 六、结果展示 七、相关链接 本文由CSDN点云侠原创,博客长期更新,本文最近一次更新时间为:2026年5月24日。 一、算法原理 1、计算…...

谷氨酸发酵过程的软测量建模【附模型】

✨ 长期致力于软测量、谷氨酸发酵、动力学模型、支持向量机、高斯过程、变量选择、异常状态研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)多阶段高斯…...

PCL 法向量夹角剔除错误匹配点对【2026最新版】

目录 一、 算法简介 1、主要函数 2、参考文献 二、 代码实现 三、 结果展示 四、 参考链接 博客长期更新,本文最新更新时间为:2026年5月24日。代码在PCL1.15.1中测试通过 一、 算法简介 在三维点云配准中,对应点(correspondence)的准确性直接决定了配准算法的精度和鲁棒性…...

在Hermes Agent项目中接入Taotoken作为自定义模型供应商

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Hermes Agent项目中接入Taotoken作为自定义模型供应商 基础教程类,针对使用Hermes Agent框架的开发者,详…...

巨量投放总结

巨量商务管理平台 : https://business.oceanengine.com 巨量广告投放平台: https://ad.oceanengine.com 商务管理平台 账户 广告组 计划 广告投放平台 层级关系: 广告组 -> 计划 -> 创意 对应FB: 系列 - > 广告组 -> 广告...

如何快速掌握MoveIt2:面向ROS 2开发者的工业机器人运动规划完整指南

如何快速掌握MoveIt2:面向ROS 2开发者的工业机器人运动规划完整指南 【免费下载链接】moveit2 :robot: MoveIt for ROS 2 项目地址: https://gitcode.com/gh_mirrors/mo/moveit2 想要为你的机器人实现智能运动规划吗?MoveIt2作为ROS 2生态中最强大…...

flameshow性能优化技巧:如何快速定位Go程序中的CPU热点

flameshow性能优化技巧:如何快速定位Go程序中的CPU热点 【免费下载链接】flameshow A terminal Flamegraph viewer. 项目地址: https://gitcode.com/gh_mirrors/fl/flameshow 🔥 想要快速定位Go程序中的性能瓶颈吗?flameshow是一个强大…...

MeloTTS实战:多语言语音合成的高效解决方案

MeloTTS实战:多语言语音合成的高效解决方案 【免费下载链接】MeloTTS High-quality multi-lingual text-to-speech library by MyShell.ai. Support English, Spanish, French, Chinese, Japanese and Korean. 项目地址: https://gitcode.com/GitHub_Trending/me/…...

Office RibbonX Editor:简单三步打造你的专属Office界面

Office RibbonX Editor:简单三步打造你的专属Office界面 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribbonx-edit…...

终极指南:5步快速掌握免费的3D点云标注工具labelCloud

终极指南:5步快速掌握免费的3D点云标注工具labelCloud 【免费下载链接】labelCloud A lightweight tool for labeling 3D bounding boxes in point clouds. 项目地址: https://gitcode.com/gh_mirrors/la/labelCloud 想要为自动驾驶、机器人视觉或3D目标检测…...

MobX社区资源大全:10个必备工具、插件和扩展库推荐 [特殊字符]

MobX社区资源大全:10个必备工具、插件和扩展库推荐 🚀 【免费下载链接】MobX-Docs-CN MobX 中文文档 项目地址: https://gitcode.com/gh_mirrors/mo/MobX-Docs-CN MobX作为一个简单、可扩展的状态管理库,已经成为React开发者不可或缺的…...

CausalVLR基准测试报告:在IU X-Ray和MIMIC-CXR数据集上的性能分析

CausalVLR基准测试报告:在IU X-Ray和MIMIC-CXR数据集上的性能分析 【免费下载链接】CausalVLR CausalVLR: A Toolbox and Benchmark for Vision-Language Causal Reasoning (多模态因果推理开源框架) 项目地址: https://gitcode.com/gh_mirrors/ca/CausalVLR …...

企业内统一API网关与Taotoken聚合平台对接方案

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 企业内统一API网关与Taotoken聚合平台对接方案 在推进AI应用落地的过程中,许多中大型企业面临一个共同挑战&#xff1a…...

探索Windows 10上的Android世界:揭秘WSA-Windows-10项目的3个技术突破

探索Windows 10上的Android世界:揭秘WSA-Windows-10项目的3个技术突破 【免费下载链接】WSA-Windows-10 This is a backport of Windows Subsystem for Android to Windows 10. 项目地址: https://gitcode.com/gh_mirrors/ws/WSA-Windows-10 想象一下&#…...

终极Chrome画中画扩展:如何在浏览器中实现高效视频多任务处理

终极Chrome画中画扩展:如何在浏览器中实现高效视频多任务处理 【免费下载链接】picture-in-picture-chrome-extension 项目地址: https://gitcode.com/gh_mirrors/pi/picture-in-picture-chrome-extension 想要在浏览网页、处理文档的同时继续观看视频内容吗…...

5个必知的Universal-Updater高级功能:从QR扫描到后台安装

5个必知的Universal-Updater高级功能:从QR扫描到后台安装 【免费下载链接】Universal-Updater An easy to use app for installing and updating 3DS homebrew 项目地址: https://gitcode.com/gh_mirrors/un/Universal-Updater Universal-Updater是一款专为任…...

Hindsight测试策略:单元测试、集成测试和端到端测试

Hindsight测试策略:单元测试、集成测试和端到端测试 【免费下载链接】hindsight Hindsight: Agent Memory That Learns 项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight Hindsight作为一款专注于Agent Memory的开源项目,其可…...