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

使用Trigger触发时遇“Object reference not set”错误的解决问询

Trigger脚本空引用错误排查与解决

问题场景

给玩家挂载Trigger脚本,逻辑如下:

  • 进入带Target标签对象的Trigger区域时,启用布尔值willGrab,可搬运该对象;通过other.transform.parent实现任意数量Target对象复用同一逻辑。
  • 实际测试:5个同标签对象,进入其中一个的Trigger区域可正常搬运,退出后能自由进入其他(或同一)对象的Trigger区域操作;退出时Inspector中mainObject变为None (Transform)符合预期,进入时会更新为对应对象。

报错问题

退出任意Trigger区域时,立即触发多条**"Object reference not set to an instance of an object"**空引用错误,定位到OnTriggerExit中的mainObject = null行。之前解决过该问题,现在忘了修改方式。

当前代码

Transform mainObject;

public Transform MainObject
{
    get { return mainObject; }
}

public void OnTriggerEnter(Collider other)
{

    if (!other.CompareTag("Target")) return;

    willGrab = true;
    mainObject = other.transform.parent;
}

public void OnTriggerExit(Collider other)
{
    if (!other.CompareTag("Target")) return;

    willGrab = false;
    mainObject = null;   
}

补充测试

完全移除mainObject = null行后,快速测试未出现错误,但不确定该做法是否妥当。


解决方案

直接移除mainObject = null的合理性

如果你的搬运逻辑完全由willGrab控制,且没有任何地方通过mainObject != null判断状态,移除该行确实能正常运行——因为willGrab设为false后,搬运逻辑会被阻断,不会操作无效对象。但这种做法存在隐患:后续扩展代码若依赖mainObject是否为null判断状态,会出现误判。

更稳妥的修正方式

  1. 精准匹配后再清空引用
    在OnTriggerExit中,仅当退出的对象是当前搬运对象的子对象时,才清空mainObject,避免无关Target对象触发退出时错误清空引用:
    public void OnTriggerExit(Collider other)
    {
        if (!other.CompareTag("Target")) return;
        // 仅匹配当前正在搬运的对象时,才执行清空
        if (mainObject != null && other.transform.IsChildOf(mainObject))
        {
            willGrab = false;
            mainObject = null;
        }
    }
    
  2. 在所有使用mainObject的地方加空判断
    无论是否清空mainObject,所有访问它的代码必须先做空引用检查,从根源避免报错:
    // 示例:搬运逻辑中的检查
    if (willGrab && mainObject != null)
    {
        // 执行搬运操作
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:21:26