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

Godot中玩家在空中停止移动的技术问题求助

解决RigidBody2D玩家空中停止移动的问题

你当前遇到的情况:玩家作为RigidBody2D节点,和地面都配置了碰撞器,用_process直接修改position实现水平移动,但在空中时会停止移动。

原脚本代码:

extends RigidBody2D

var speed := Vector2(500, 0)
var firstFrame = true

func _process(delta):
    position += speed * delta
    print("player    ", position.x)


func _physics_process(delta):
    if (Input.is_key_pressed(KEY_SPACE)  && firstFrame == true):
        apply_force(Vector2(0, -35000))
        firstFrame = false
    if (Input.is_key_pressed(KEY_SPACE) != true):
        firstFrame = true

问题原因

RigidBody2D是受物理引擎驱动的节点,物理引擎会在_physics_process阶段统一更新节点的位置、速度等状态。而_process是每帧执行,手动修改position会和物理引擎的状态同步产生冲突——当玩家在空中没有碰撞约束时,物理引擎会修正节点位置,抵消你手动设置的移动量,最终导致空中停止移动。

解决方案

放弃直接修改position的方式,改用物理引擎提供的API控制移动,确保物理状态一致。以下是两种可行的修改方案:

方案1:设置线速度(适合匀速移动)

extends RigidBody2D

var speed := 500.0
var firstFrame = true

func _physics_process(delta):
    # 保持水平匀速移动
    var current_vel = linear_velocity
    current_vel.x = speed
    linear_velocity = current_vel

    # 跳跃逻辑保留
    if Input.is_key_pressed(KEY_SPACE) && firstFrame:
        apply_force(Vector2(0, -35000))
        firstFrame = false
    if not Input.is_key_pressed(KEY_SPACE):
        firstFrame = true

方案2:施加持续力(适合带加速度的移动)

如果需要模拟加速/减速的物理效果,可以用施加力的方式(需根据玩家质量调整力的数值):

extends RigidBody2D

var move_force := 1500.0
var firstFrame = true

func _physics_process(delta):
    # 施加水平力维持移动
    apply_force(Vector2(move_force, 0))

    # 跳跃逻辑保留
    if Input.is_key_pressed(KEY_SPACE) && firstFrame:
        apply_force(Vector2(0, -35000))
        firstFrame = false
    if not Input.is_key_pressed(KEY_SPACE):
        firstFrame = true

说明

使用物理引擎API控制RigidBody2D的移动,能保证无论玩家在地面还是空中,移动逻辑都会正常生效,同时避免和物理引擎的状态冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:53:11