修改maxJumps为何不影响玩家跳跃次数?Unity代码问题求助
问题分析与修复方案
核心问题
你的代码存在三个关键问题导致多段跳失效:
- 跳跃条件逻辑混乱:逻辑运算符优先级导致空中跳跃的判断没有正确结合剩余跳跃次数限制,且条件逻辑不符合多段跳的需求。
- 浮点类型的跳跃次数:用
float存储currentJumps和maxJumps可能引发精度问题,导致次数比较出现意外结果。 - 地面状态判断冲突:同时用
OverlapCapsule和碰撞事件修改newIsGrounded,导致地面状态判断混乱,可能错误重置跳跃次数。
修复步骤
1. 修正变量类型
将跳跃次数改为整数类型,避免浮点精度问题:
public float jumpingPower = 16f; public int maxJumps = 1; // 改为int private int currentJumps; // 改为int public float coyoteTimerMax = .03f; private float coyoteTimer; private float jumpBuffer; public float maxJumpBuffer = .3f; bool newIsGrounded;
2. 重构跳跃条件逻辑
重新梳理跳跃判断逻辑,明确地面跳跃(含coyote时间)和空中跳跃的触发条件:
void Update() { if (Input.GetButtonDown("Jump")) { jumpBuffer = maxJumpBuffer; } jumpBuffer -= Time.deltaTime; if (newIsGrounded) { currentJumps = 0; coyoteTimer = coyoteTimerMax; dashUsed = 0; } else { coyoteTimer -= Time.deltaTime; } // 跳跃触发条件:有有效跳跃缓冲,且还有剩余跳跃次数,且(处于地面/coyote时间 或 已进行过空中跳跃) bool hasValidJumpBuffer = jumpBuffer > 0; bool hasRemainingJumps = currentJumps < maxJumps; bool canJumpFromGroundOrCoyote = coyoteTimer > 0; bool canAirJump = currentJumps > 0; if (hasValidJumpBuffer && hasRemainingJumps && (canJumpFromGroundOrCoyote || canAirJump)) { rb.velocity = new Vector2(rb.velocity.x, jumpingPower); currentJumps++; newIsGrounded = false; jumpBuffer = 0; coyoteTimer = 0; // 跳跃后关闭coyote时间,避免重复触发地面跳跃 } // ...其他代码 }
3. 统一地面状态判断
删除OnCollisionEnter2D和OnCollisionExit2D中修改newIsGrounded的代码,仅保留FixedUpdate中的胶囊体检测,避免状态冲突:
private void FixedUpdate() { // ...其他代码 newIsGrounded = Physics2D.OverlapCapsule(groundCheck.position, new Vector2(.999f, .0144f), CapsuleDirection2D.Horizontal, 0, groundLayer); // ...其他代码 } // 删除以下两个方法 // void OnCollisionEnter2D(Collision2D other) { ... } // void OnCollisionExit2D(Collision2D other) { ... }
修复原理
- 整数类型的跳跃次数确保次数比较完全准确,不会出现浮点精度误差。
- 重构后的条件明确区分了地面跳跃和空中跳跃的触发场景,确保只要还有剩余跳跃次数且触发了跳跃缓冲,就能执行空中跳跃。
- 统一地面状态判断方式,避免碰撞事件和胶囊体检测的状态冲突,保证跳跃次数的重置逻辑稳定。
内容的提问来源于stack exchange,提问作者Noyokay
相关产品推荐
相关产品推荐

