You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity/C#中如何向无关游戏对象发送事件/消息?以玩家敌人为例

实现Player监听Enemy击杀事件的无依赖方案

问题背景

现有两个独立的Unity实体:Player(玩家)和Enemy(敌人),各自拥有独立C#脚本。Enemy的基础生命值管理代码如下:

[SerializeField] float health = 3;

public void TakeDamage(float damage)
{
    health -= damage;

    if (health <= 0) {
        Destroy(gameObject);
        // 此处需要触发事件通知Player
    }
}

需求是让Player知晓自己击杀了Enemy,且能明确是哪个Enemy被摧毁。尝试过两种方案但存在问题:

  • Actions/Delegates:需要Player导入Enemy的公共委托/动作,产生代码依赖,不符合两者概念上无关的设定;
  • Unity内置事件(如UI按钮OnClick()):Player和Enemy可能在运行时实例化,无法预先配置事件绑定。

期望Player脚本能通过类似如下代码监听事件:

void OnEnemyDestroyed(GameObject enemy) { 
    // 此处处理敌人死亡后的逻辑
}

请问该需求是否可实现?


当然可以实现!用全局事件中心(Event Bus)解耦

核心思路是引入一个完全独立的全局事件中心,作为Player和Enemy之间的消息中转,彻底消除两者的代码依赖。

第一步:实现全局事件总线

创建一个静态类(或单例MonoBehaviour),不需要依赖Player或Enemy的任何代码:

public static class GameEventBus
{
    // 定义带GameObject参数的敌人死亡事件
    public static event System.Action<GameObject> OnEnemyKilled;

    // 供外部调用的事件触发方法
    public static void TriggerEnemyKilled(GameObject enemy)
    {
        OnEnemyKilled?.Invoke(enemy);
    }
}

第二步:修改Enemy脚本触发事件

注意要在Destroy之前触发事件,避免对象被标记销毁后部分属性无法正常访问:

[SerializeField] float health = 3;

public void TakeDamage(float damage)
{
    health -= damage;

    if (health <= 0) {
        // 先触发事件通知,再销毁自身
        GameEventBus.TriggerEnemyKilled(gameObject);
        Destroy(gameObject);
    }
}

第三步:Player脚本中监听事件

Player只需要引用事件中心,完全不需要依赖Enemy的代码:

private void OnEnable()
{
    // 启用时注册事件监听
    GameEventBus.OnEnemyKilled += OnEnemyDestroyed;
}

private void OnDisable()
{
    // 必须取消注册,防止内存泄漏
    GameEventBus.OnEnemyKilled -= OnEnemyDestroyed;
}

void OnEnemyDestroyed(GameObject enemy) { 
    // 这里可以处理击杀逻辑,比如加分、播放音效、统计击杀数等
    Debug.Log($"击杀了敌人:{enemy.name}");
}

方案优势

  • 彻底解耦:Player和Enemy互相不需要引用对方的脚本,符合两者概念上独立的设定;
  • 支持运行时实例化:不管Enemy或Player何时创建,只要在启用时注册监听,就能正常接收事件;
  • 扩展性强:后续如果成就系统、音效系统等需要监听敌人死亡事件,直接通过事件中心注册即可,无需修改Enemy代码。

内容的提问来源于stack exchange,提问作者IronWaffleMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:10:14