Skip to content

event

csharp-event-deep-dive

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

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0