2D游戏跳跃顶点重力调整异常:计数器未正常递减
问题根源分析
你的gravityCounter无法递减的核心原因是每帧都会被强制重置:
在第一个if-else分支中,只有当首次触发跳跃顶点检测(rb.velocity.y < 0 && highPoint == false && isJumping == true)的那一帧,才会执行gravityCounter -= Time.deltaTime;下一帧开始,因为highPoint已经被设为true,条件不满足,直接进入else分支把gravityCounter重置回0.2f,导致计数器永远无法走到负数。
另外代码里还有几个额外问题:
- 频繁调用
GetComponent会消耗性能,应该提前缓存组件引用 highPoint的重置逻辑放在顶点检测之后,可能导致状态切换冲突- 多个布尔状态(
increaseGravity/decreaseGravity)的切换逻辑不够严谨,容易出现状态重叠
修复后的代码
public bool increaseGravity = false; public bool decreaseGravity = false; public float gravityCounter = 0.2f; // 初始化计数器 public float gravityModifierDown = 2.75f; public float gravityModifierUp = 4.25f; public float normalGravity = 3.5f; bool highPoint = false; [SerializeField] private Rigidbody2D rb; [SerializeField] private PlayerMovement playerMovement; // 提前缓存组件 private void Awake() { // 初始化时获取组件,避免每帧调用GetComponent if (playerMovement == null) playerMovement = GetComponent<PlayerMovement>(); } private void Update() { // 落地或贴墙时重置所有状态 if (playerMovement.IsGrounded() || playerMovement.IsWalled()) { increaseGravity = false; decreaseGravity = false; highPoint = false; gravityCounter = 0.2f; // 重置计数器 rb.gravityScale = normalGravity; return; // 直接返回,跳过后续逻辑 } // 检测跳跃顶点:上升阶段结束,首次进入下落状态 if (rb.velocity.y < 0 && !highPoint && playerMovement.isJumping) { highPoint = true; Debug.Log("highPoint"); decreaseGravity = true; increaseGravity = false; } // 顶点状态下,持续递减计数器 if (highPoint) { gravityCounter -= Time.deltaTime; // 计数器归零时切换重力状态 if (gravityCounter < 0f) { Debug.Log("Gravity Counter Empty"); decreaseGravity = false; increaseGravity = true; highPoint = false; // 关闭顶点状态,避免重复触发 } } // 上升阶段重置顶点状态和计数器 else if (rb.velocity.y > 0) { highPoint = false; gravityCounter = 0.2f; } // 应用重力缩放 if (decreaseGravity) { rb.gravityScale = gravityModifierDown; } else if (increaseGravity) { rb.gravityScale = gravityModifierUp; } }
关键修改点说明
- 缓存组件引用:在
Awake中获取PlayerMovement,避免每帧调用GetComponent,提升性能 - 调整计数器逻辑:只有在顶点状态(
highPoint == true)时才持续递减计数器,其他场景只在落地/上升阶段重置,不再每帧强制覆盖 - 重构状态优先级:把落地/贴墙的状态重置放在最开头,确保只要角色接触地面,所有重力状态立刻恢复正常
- 简化状态切换:通过
else if避免increaseGravity和decreaseGravity同时生效的情况,逻辑更清晰
内容的提问来源于stack exchange,提问作者AzaleaHG
相关产品推荐
相关产品推荐

