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

Unity/C#如何向事件添加函数 实现抽象类强制子类实现OnDeath UnityEvent

问题核心原因说明

UnityAction是Unity官方封装的无参数、无返回值的委托类型,和你自定义的Function委托、System.Func属于完全不同的类型,哪怕签名看起来类似也不能隐式转换,这是你报错的根本原因:UnityEvent.AddListener()只接受UnityAction类型的参数。

另外不要在MonoBehaviour的构造函数里写初始化逻辑,Unity序列化阶段会自动调用Mono的构造函数,容易出现不可预期的异常,初始化逻辑统一放在Awake/Start生命周期方法中。


最简实现方案

你的需求不需要复杂的自定义委托,直接用Unity原生类型就能实现,父类封装通用逻辑,只强制要求子类实现核心的死亡判定和死亡处理方法即可:

父类 EntityManager 实现

using UnityEngine;
using UnityEngine.Events;

public abstract class EntityManager : MonoBehaviour
{
    // 直接定义Unity原生死亡事件
    public UnityEvent OnDeathEvent = new UnityEvent();

    private void Awake()
    {
        // 提前注册抽象死亡方法,子类实现后自动触发
        OnDeathEvent.AddListener(OnDeath);
        // 子类如有Awake逻辑,必须调用base.Awake()保证该逻辑生效
    }

    // 强制子类实现:存活判定
    public abstract bool IsAlive();

    // 强制子类实现:死亡核心逻辑
    public abstract void OnDeath();

    // 父类直接实现监听添加方法,子类无需重写
    public void AddOnDeathListener(UnityAction listener)
    {
        OnDeathEvent.AddListener(listener);
    }

    // 父类封装死亡触发逻辑,统一管控触发时机
    protected void TriggerDeath()
    {
        if (IsAlive()) return;
        OnDeathEvent?.Invoke();
    }
}

子类 EnemyManager 实现

public class EnemyManager : EntityManager
{
    private Enemy _enemy;
    public Enemy Enemy { get => _enemy; set => _enemy = value; }

    private void Awake()
    {
        base.Awake();
        _enemy = new Enemy();
    }

    public override bool IsAlive()
    {
        return Enemy.IsAlive();
    }

    public void NextEnemy()
    {
        Enemy = new Enemy();
    }

    public override void OnDeath()
    {
        NextEnemy();
    }

    // 不需要重写AddOnDeathListener,父类已实现
}

调用示例

外部添加死亡监听时直接传无参无返回值的方法即可,Unity会自动将普通方法转换为UnityAction类型:

// 给敌人添加死亡监听
enemyManager.AddOnDeathListener(OnEnemyDead);

// 监听回调方法
private void OnEnemyDead()
{
    Debug.Log("敌人已死亡");
}

如果需要带参数的死亡事件,替换为UnityEvent<T>和对应的UnityAction<T>类型即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:24:03