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
相关产品推荐
相关产品推荐

