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

修改Brackeys 2D移动脚本新增双地面检测后报错无法跳跃求助

问题修复方案

错误根源

你遇到的IndexOutOfRangeException报错、角色无法跳跃的问题,完全是新增第二个地面检测点时的代码笔误导致:
在FixedUpdate中处理第二个检测点m_GroundCheck2的逻辑里,你将检测结果存入了colliders2数组,但for循环的终止条件错误使用了第一个检测点的数组长度colliders.Length,而非colliders2.Length。
当m_GroundCheck2未接触地面时,colliders2是空数组,但循环仍会按照colliders的长度去遍历访问colliders2[i],自然触发数组索引越界,同时该异常会打断固定更新逻辑,导致地面判定失效、角色无法跳跃。

修复代码

你只需要替换FixedUpdate部分的代码即可,同时优化了落地事件重复触发的问题:

private void FixedUpdate()
{
    bool wasGrounded = m_Grounded;
    m_Grounded = false;

    // 检测第一个地面点
    Collider2D[] colliders = Physics2D.OverlapCircleAll(m_GroundCheck.position, k_GroundedRadius, m_WhatIsGround);
    for (int i = 0; i < colliders.Length; i++)
    {
        if (colliders[i].gameObject != gameObject)
        {
            m_Grounded = true;
        }
    } 
    // 检测第二个地面点
    Collider2D[] colliders2 = Physics2D.OverlapCircleAll(m_GroundCheck2.position, k_GroundedRadius, m_WhatIsGround);
    // 修复:循环条件改为使用colliders2的长度
    for (int i = 0; i < colliders2.Length; i++)
    {
        if (colliders2[i].gameObject != gameObject)
        {
            m_Grounded = true;
        }
    }
    // 统一判断落地事件,避免两个检测点重复触发
    if (m_Grounded && !wasGrounded)
    {
        OnLandEvent.Invoke();
    }
}

额外优化建议

  • 后续如果要加更多检测点,可以把检测点存入一个Transform数组,用循环统一处理,不用重复写多段检测逻辑
  • 可以直接用Physics2D.OverlapCircle(不需要All版本)来判断是否存在地面碰撞,不用遍历数组,代码更简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:18:03