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

Unity中C#事件正常触发但订阅者方法不执行是什么原因?

问题原因
  • 实例不匹配为核心故障点:你在AttachedContainer的Start方法中通过new关键字创建了一个全新的OpenInteraction实例,仅给这个新实例的OpenStateChange事件绑定了回调。但实际玩家操作触发OnOpenStateChange方法的是场景中已经和交互逻辑绑定的另一个OpenInteraction实例,两个实例完全独立,你订阅的实例永远不会接收到触发信号,因此不会打印对应日志。
  • 额外异常点(若符合你的代码场景):如果OpenInteraction是继承自MonoBehaviour的类,直接用new创建实例本身就是Unity的错误用法,继承MonoBehaviour的类必须挂载在GameObject上,通过GetComponent/AddComponent或面板赋值的方式获取实例,不能直接new生成。
修复方案

不要自行创建新的OpenInteraction实例,改为获取实际触发交互的目标实例引用即可,推荐两种实现方式:

  1. 直接在Inspector面板赋值:将openInteraction改为public,在Unity编辑器中拖拽场景中绑定了交互逻辑的OpenInteraction实例到对应字段上
  2. 代码动态查找:如果不方便手动赋值,可通过Unity提供的组件查找方法获取对应实例

修改后的参考代码如下:

public class AttachedContainer : MonoBehaviour
{ 
    // 改为public支持Inspector拖拽赋值
    public OpenInteraction openInteraction;

    public void Start()
    {
        Debug.Log("create OpenInteraction in AttachedContainer");
        // 未手动赋值的话,尝试从当前GameObject上获取组件,可根据你的实际场景调整查找逻辑
        if(openInteraction == null)
        {
            openInteraction = GetComponent<OpenInteraction>();
        }
        if(openInteraction != null)
        {
            openInteraction.OpenStateChange += ContainerOpened;    
        }
    }

    // 若不需要访问类内非静态成员可以保留static,否则去掉static修饰符即可
    void ContainerOpened(object sender, bool e)
    {
        Debug.Log("container state changed");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 10:06:03