欢迎回来今天我们来搞定理解委托和事件的核心概念用受伤、得分、游戏结束三个游戏场景掌握解耦思路一、为什么要用事件先看耦合的痛点假设玩家受伤时需要同时做三件事、玩家受伤├── UI 血条减少├── 音效播放受伤音└── 相机震动不用事件的写法强耦合// 玩家脚本里直接调用所有系统 void TakeDamage(float damage) { health - damage; UIManager.Instance.UpdateHealthBar(health); // 直接调用UI AudioManager.Instance.PlayHurtSound(); // 直接调用音效 CameraShake.Instance.Shake(); // 直接调用相机 }问题出在哪问题后果玩家脚本要知道 UI、音效、相机的存在改一个系统可能连锁修改多处删掉音效系统 → 玩家脚本报错牵一发而动全身新增受伤特效→ 要改玩家脚本功能越多玩家脚本越臃肿类比强耦合就像公司老板直接给每个员工打电话布置任务——老板要记住所有员工的电话换人了就要改号码。事件就是设一个广播电台——老板只管播报消息员工自己决定要不要收听互不依赖。二、委托——函数的类型委托delegate本质是用来存储函数的变量类型。类比普通变量存的是数据int 存数字string 存文字委托变量存的是方法函数。// 声明一个委托类型规定无参数无返回值 delegate void OnDamageHandler(); // 这个委托变量可以存符合格式的方法 OnDamageHandler myDelegate; // 把方法赋给委托 void PlaySound() { Debug.Log(播放音效); } myDelegate PlaySound; // 注意不加括号 // 调用委托 调用它存的方法 myDelegate(); // 输出播放音效三、Action——最常用的内置委托Unity 开发中不需要自己声明 delegate直接用 C# 内置的Action就够了类型说明示例Action无参数、无返回值游戏结束通知ActionT一个参数、无返回值传递受伤数值ActionT1, T2两个参数传坐标、传名字分数Action onGameOver; // 无参 Actionfloat onDamage; // 带一个float参数伤害值 Actionstring, int onScore; // 带两个参数玩家名、分数四、event 关键字——给委托加保护锁光用Action有个隐患任何地方都可以直接调用或清空它。加上event关键字可以限制只有声明它的类能触发外部只能订阅/取消订阅。// 没有 event任何脚本都能 GameManager.OnGameOver() 直接触发 public static Action OnGameOver; // 加了 event外部只能 或 -不能直接调用 public static event Action OnGameOver;操作有 event无 event订阅允许允许取消订阅-允许允许从外部触发()报错允许危险从外部清空 null报错允许危险五、完整三步走——事件的标准用法第一步声明事件在广播站里第二步订阅事件在听众里第三步触发事件事情发生时六、完成一个得分事件委托那么我们来完成一个小小的实列吧using UnityEngine; // ── 得分管理器发布者────────────────── public class ScoreManager : MonoBehaviour { public static event Actionint OnScoreChanged; // 携带当前总分 private static int totalScore 0; // 静态方法任何地方可以调用 public static void AddScore(int points) { totalScore points; OnScoreChanged?.Invoke(totalScore); Debug.Log(得分当前总分 totalScore); } }// ── 分数UI订阅者────────────────────── public class ScoreUI : MonoBehaviour { void OnEnable() { ScoreManager.OnScoreChanged UpdateScoreDisplay; } void OnDisable() { ScoreManager.OnScoreChanged - UpdateScoreDisplay; } void UpdateScoreDisplay(int score) { Debug.Log(UI显示分数 score); // GetComponentText().text 分数 score; } }使用方式敌人死亡时调用ScoreManager.AddScore(10)即可不需要引用任何 UI 脚本。七、一定要记住订阅了就要取消订阅// 错误写法只订阅不取消 void Start() { GameManager.OnGameOver DoSomething; } // 这个对象销毁了但 OnGameOver 还记着它 → 报空引用错误 // 正确写法成对出现 void OnEnable() { GameManager.OnGameOver DoSomething; } void OnDisable() { GameManager.OnGameOver - DoSomething; }场景订阅位置取消位置场景内始终存在的对象Awake/StartOnDestroy会被禁用/启用的对象OnEnableOnDisable八、知识点总结核心语法作用public static event Action OnXxx声明静态事件OnXxx?.Invoke()安全触发事件OnXxx 方法名订阅开始监听OnXxx - 方法名取消订阅停止监听今天的内容就到这里接下来我将连续更新90天的Untiy教程从基础到一个网络部分有兴趣的朋友们可以收藏关注谢谢如果有疑问评论区见。