Unity跨脚本事件无法触发处理函数问题求助
问题:Unity事件订阅后处理函数未执行
我有两个脚本ScriptA和ScriptB:ScriptA会在销毁GameObject时触发OnObjDestroy事件,ScriptB负责处理该事件,但功能未生效。调试发现事件已被调用,但DestroyObjHandler函数未被执行,即使将事件订阅代码移至Update方法中也无效。
原脚本代码
ScriptA
public delegate void DestroyCallback(GameObject obj); public event DestroyCallback OnObjDestroy; public void DestroyObjEvent(GameObject obj) { if (OnObjDestroy != null) OnObjDestroy(obj); } void DestroyButtonClick() { DestroyObjEvent(obj); }
ScriptB
ScriptA scriptAInstance = new ScriptA(); void DestroyObjHandler(GameObject obj) { Debug.Log(obj.name); } void Start() { selectObjInstance.OnObjDestroy += DestroyObjHandler; }
问题原因及解决方法
MonoBehaviour不能直接用
new实例化
Unity中继承自MonoBehaviour的脚本必须挂载到场景内的GameObject上才能被引擎正确管理,new ScriptA()创建的实例不属于任何GameObject,无法参与Unity的事件系统,订阅的事件自然不会被触发。变量名引用错误
ScriptB中声明了scriptAInstance,但订阅事件时用了未定义的selectObjInstance,属于笔误,导致订阅操作作用在空引用上。修正后的ScriptB代码
改为通过Inspector拖拽赋值或代码查找的方式获取ScriptA的有效实例:
// 标记为可序列化,方便在Inspector面板拖拽赋值 [SerializeField] private ScriptA scriptAInstance; void DestroyObjHandler(GameObject obj) { Debug.Log(obj.name); } void Start() { // 先校验实例有效性,避免空引用异常 if (scriptAInstance != null) { scriptAInstance.OnObjDestroy += DestroyObjHandler; } }
- 额外注意事项
确保ScriptA中DestroyButtonClick方法里的obj是正确的GameObject引用;如果ScriptA挂载在要销毁的物体上,要先调用DestroyObjEvent(obj)触发事件,再执行Destroy(obj)销毁物体,避免脚本实例被提前销毁导致事件无法传递。
内容的提问来源于stack exchange,提问作者an0ther
相关产品推荐
相关产品推荐

