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

接口声明静态事件后实现类触发报错,求监听实例创建方案

问题分析与解决方案

你的问题根源在于C#接口的静态成员不具备全局共享性:接口中定义的静态事件EvtSpawned属于接口本身,但实现该接口的类并不会继承或共享这个静态事件实例。当你在PlayerSingle中调用IProgress.EvtSpawned?.Invoke(this)时,这个事件实际上从未被初始化,自然会触发错误。

正确实现方式:用静态管理类统一处理全局事件

不要在接口中定义静态事件,而是创建一个独立的静态类来管理这个全局的实例创建通知:

1. 调整接口定义(仅保留标识或必要实例成员)

public interface IProgress
{
    // 这里不需要静态事件,仅作为实现类的标识或定义实例方法
}

2. 创建静态事件管理类

public static class ProgressSpawnManager
{
    // 全局共享的实例创建事件
    public static event Action<IProgress> EvtSpawned;

    // 统一的通知方法,供实现类调用
    public static void NotifySpawned(IProgress progressInstance)
    {
        EvtSpawned?.Invoke(progressInstance);
    }
}

3. 修改实现类的调用逻辑

public class PlayerSingle : MonoBehaviour, IProgress
{
    private void Start()
    {
        // 通过管理类触发全局事件
        ProgressSpawnManager.NotifySpawned(this);
    }
}

方案优势

  • 所有实现IProgress的类都通过同一个入口触发事件,订阅方只需订阅ProgressSpawnManager.EvtSpawned,就能监听所有实例的创建通知。
  • 避免了每个实现类重复定义静态事件的冗余代码,逻辑更统一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:25:22