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
相关产品推荐
相关产品推荐

