Appearance
event
event 是什么
event 是“发生通知”。 比如玩家受伤了,PlayerHealth 发出通知,UI、音效、任务系统各自响应。
c
using System;
using UnityEngine;
public class PlayerHealth : MonoBehaviour
{
public event Action<int> OnDamaged;
public void TakeDamage(int damage)
{
OnDamaged?.Invoke(damage);
}
}订阅事件
c
public class HpUI : MonoBehaviour
{
[SerializeField] private PlayerHealth player;
private void OnEnable()
{
player.OnDamaged += Refresh;
}
private void OnDisable()
{
player.OnDamaged -= Refresh;
}
private void Refresh(int damage)
{
Debug.Log($"刷新血条,伤害:{damage}");
}
}event 和 delegate 的区别
delegate 字段更自由,外部可能赋值、清空、调用。 event 更安全,外部通常只能 += 订阅、-= 取消订阅,不能随便 Invoke。
c
public Action OnDead; // 外部可乱改
public event Action OnDead; // 外部只能订阅/取消所以公开“某件事发生了”的通知时,优先用 event。
Unity 里常见用法
角色受伤:OnDamaged 角色死亡:OnDead 背包变化:OnInventoryChanged 游戏结束:OnGameOver 金币变化:OnGoldChanged
常见坑
OnEnable 订阅,OnDisable 取消订阅,别忘了配对。 同一个方法重复 +=,事件触发时会执行多次。 匿名 lambda 不好 -= 移除,需要取消订阅时保存成变量。 event 适合代码层通知;需要 Inspector 配置时,用 UnityEvent 更方便。
参考链接Microsoft C# Eventsevent 关键字EventHandlerEventArgsActionUnity UnityEvent