Unity中C#事件正常触发但订阅者方法不执行是什么原因?
问题原因
- 实例不匹配为核心故障点:你在
AttachedContainer的Start方法中通过new关键字创建了一个全新的OpenInteraction实例,仅给这个新实例的OpenStateChange事件绑定了回调。但实际玩家操作触发OnOpenStateChange方法的是场景中已经和交互逻辑绑定的另一个OpenInteraction实例,两个实例完全独立,你订阅的实例永远不会接收到触发信号,因此不会打印对应日志。 - 额外异常点(若符合你的代码场景):如果
OpenInteraction是继承自MonoBehaviour的类,直接用new创建实例本身就是Unity的错误用法,继承MonoBehaviour的类必须挂载在GameObject上,通过GetComponent/AddComponent或面板赋值的方式获取实例,不能直接new生成。
修复方案
不要自行创建新的OpenInteraction实例,改为获取实际触发交互的目标实例引用即可,推荐两种实现方式:
- 直接在Inspector面板赋值:将
openInteraction改为public,在Unity编辑器中拖拽场景中绑定了交互逻辑的OpenInteraction实例到对应字段上 - 代码动态查找:如果不方便手动赋值,可通过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
相关产品推荐
相关产品推荐

