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

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;
    }
}
关键修改点说明
  1. 缓存组件引用:在Awake中获取PlayerMovement,避免每帧调用GetComponent,提升性能
  2. 调整计数器逻辑:只有在顶点状态(highPoint == true)时才持续递减计数器,其他场景只在落地/上升阶段重置,不再每帧强制覆盖
  3. 重构状态优先级:把落地/贴墙的状态重置放在最开头,确保只要角色接触地面,所有重力状态立刻恢复正常
  4. 简化状态切换:通过else if避免increaseGravity和decreaseGravity同时生效的情况,逻辑更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:23:11