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

如何让Godot中KinematicBody2D角色跳跃后缓慢下落?

解决Godot 2D角色跳跃后下落过快的问题

核心问题分析

你的代码里gravity设为10000,这个数值远高于Godot开发中的常规取值(通常1500-3000就足够),这是导致下落过快的主要原因。另外,当前逻辑没有区分上升和下落阶段的重力,也没有限制下落的最大速度,进一步加剧了这个问题。

简单解决方案

1. 降低基础重力值

直接调小gravity变量,这是最快速有效的方法:

var gravity = 2500 # 替换原来的10000,可根据手感微调

2. 区分上升/下落阶段的重力

在下落时使用更小的重力,让下落过程更平缓:
修改calculate_velocity函数中的重力处理逻辑:

else: # 处理重力
    # 上升阶段(velocity.y < 0)用正常重力,下落阶段用更低的重力
    var applied_gravity = gravity if curVelocity.y > 0 else gravity * 0.6
    out.y = curVelocity.y + (applied_gravity * delta)

3. 限制下落终端速度

给下落速度设置一个上限,避免速度无限增大:
在上述重力处理后添加终端速度限制:

# 限制最大下落速度,数值可根据需求调整
out.y = min(out.y, 800)

4. 优化跳跃中断逻辑

原来的跳跃中断直接把y速度重置为gravity * delta,会导致角色突然下坠,改成平滑过渡:

if(is_jump_interupted): # 松开跳跃键
    out.y = max(out.y, 0) # 让上升速度立刻转为0,开始缓慢下落

修改后的完整代码

extends KinematicBody2D


var speed = Vector2(500, 2500)
var gravity = 2500 # 降低基础重力
var friction = 0.1
var acceleration = 0.2
var velocity = Vector2.ZERO
var max_fall_speed = 800 # 新增终端速度限制


func _physics_process(delta: float) -> void:
    var dir = get_direction()
    var is_jump_interupted = Input.is_action_just_released("jump") and velocity.y < 0.0
    velocity = calculate_velocity(velocity, dir, is_jump_interupted, speed, delta)
    velocity = move_and_slide(velocity, Vector2.UP)
    # print(velocity) # 测试用的打印可按需保留


func get_direction():
    return Vector2(
        Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left"),
        -1.0 if Input.is_action_just_pressed("jump") and is_on_floor() else 0.0
    )

func calculate_velocity(curVelocity, dir, is_jump_interupted, speed, delta):
    var out = Vector2.ZERO

    if dir.x != 0:
        out.x = lerp(curVelocity.x, dir.x * speed.x, acceleration)
    else:
        out.x = lerp(curVelocity.x, 0, friction)

    if(dir.y == -1.0): # 跳跃
        out.y = dir.y * speed.y
    else: # 处理重力
        # 区分上升/下落的重力
        var applied_gravity = gravity if curVelocity.y > 0 else gravity * 0.6
        out.y = curVelocity.y + (applied_gravity * delta)
        # 限制最大下落速度
        out.y = min(out.y, max_fall_speed)

    if(is_jump_interupted): # 松开跳跃键
        out.y = max(out.y, 0) # 平滑过渡到下落

    return out

你可以根据实际手感需求,微调gravity、max_fall_speed以及重力比例(0.6)这些参数,直到达到满意的缓慢下落效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:20:17