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

解决“Transform child out of bounds”异常:父物体触发激活子物体问题

问题排查与解决方案

首先,咱们来拆解你遇到的两个核心问题:

1. 为什么会出现「Transform child out of bounds」异常?

你代码里的if (col.transform.GetChild(0) != null)这个判断是无效的——Transform.GetChild(index)方法不会返回null,如果指定索引的子物体不存在,它会直接抛出索引越界异常,根本走不到判断是否为null的步骤。这就是你报错的直接原因。

2. 逻辑上的核心错误

从你的描述来看,你的脚本应该是挂在父物体BallIndigo1上的,对吧?那OnTriggerEnter2D(Collider2D col)中的col参数,指的是进入这个触发器的其他物体的碰撞体,而不是BallIndigo1本身!你现在的代码是在试图操作「触发你的那个物体」的子物体,而不是你真正想操作的BallIndigo1的子物体,这完全搞反了逻辑。

修正后的代码

下面是调整后的正确代码,我还加了更安全的子物体判断方式:

void OnTriggerEnter2D(Collider2D col)
{
    // 先确认当前脚本所在的父物体(BallIndigo1)有子物体
    if (transform.childCount > 0)
    {
        // 获取第一个子物体并激活
        transform.GetChild(0).gameObject.SetActive(true);
    }
    else
    {
        Debug.Log("父物体BallIndigo1没有子物体");
    }
}

额外优化建议

如果你的子物体有明确的名字(比如叫「x」),用名字查找会比索引更可靠(避免后续调整子物体顺序导致索引失效):

void OnTriggerEnter2D(Collider2D col)
{
    // 通过名字查找子物体
    GameObject targetChild = transform.Find("x");
    if (targetChild != null)
    {
        targetChild.SetActive(true);
    }
    else
    {
        Debug.Log("找不到名为x的子物体");
    }
}

最后要确认的细节

  • 确保你的脚本确实挂在BallIndigo1这个父物体上
  • 确认父物体的触发器组件(比如BoxCollider2D)已经勾选了「Is Trigger」选项
  • 确认触发的双方至少有一个物体带有Rigidbody2D组件(2D触发器的必要条件)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:46:30