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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 09:43:17