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

Unity关闭程序时触发Assertion failed on expression: 'go.IsActive()'错误求助

解决Unity关闭时Assertion failed on expression: 'go.IsActive()'错误

这个错误是因为程序关闭阶段,Unity正在销毁场景对象,而你的OnTriggerExit2D方法仍在尝试访问已经失活或被销毁的对象导致的。结合你的代码,这里有几个直接的修复方案:

优化代码逻辑,避免无效对象访问

首先你完全不需要通过GameObject.Find获取目标对象——触发事件的col本身就关联着对应的GameObject,直接从它身上获取组件更高效安全,还能避免名字查找的潜在问题。同时要在访问组件前增加空值和激活状态检查:

void OnTriggerExit2D(Collider2D col)
{
    // 先检查col是否有效,以及其关联的GameObject是否处于激活状态
    if (col == null || !col.gameObject.activeInHierarchy)
        return;

    // 直接从col的GameObject获取Info组件,无需通过名字查找
    Info info = col.GetComponent<Info>();
    
    // 检查组件是否存在且所在对象激活
    if (info != null && info.gameObject.activeInHierarchy)
    {
        if (info.Ground)
        {
            Touch = false;
        }
    }
}

增加程序退出时的逻辑拦截

如果上面的优化还不能彻底解决问题,可以增加全局判断,在程序退出阶段直接跳过该逻辑:

void OnTriggerExit2D(Collider2D col)
{
    // 程序退出时直接返回,不执行后续逻辑
    if (!Application.isPlaying)
        return;

    if (col == null || !col.gameObject.activeInHierarchy)
        return;

    Info info = col.GetComponent<Info>();
    
    if (info != null && info.gameObject.activeInHierarchy)
    {
        if (info.Ground)
        {
            Touch = false;
        }
    }
}

原代码出错原因

你之前用GameObject.Find(ColPH)的问题在于:程序关闭时,目标对象可能已经被Unity销毁或设置为失活,此时GameObject.Find返回的对象状态异常,后续访问其组件就会触发go.IsActive()的断言失败。直接通过col获取组件能绕开这个问题,因为col是触发事件的对象,只要事件能触发,它的引用在当前帧是有效的(但仍需做安全检查)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:58:15