修改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
相关产品推荐
相关产品推荐

