Godot 4角色跳跃异常:表现为瞬移而非正常跳跃求助
Godot角色跳跃瞬移问题修复
问题场景
开发平台游戏学习Godot,实现角色左右移动和跳跃功能后,发现角色跳跃时并非正常上升至最高点,而是呈现瞬移效果。相关代码如下:
extends CharacterBody2D @export var speed = 444.44 @export var jump_height:float @export var jump_time_to_peak:float @export var jump_time_to_descent:float @onready var jump_velocity:float = ((2.0*jump_height)/jump_time_to_peak)*-1.0 @onready var jump_gravity:float = ((-2.0*jump_height)/(jump_time_to_peak*jump_time_to_peak))*-1.0 @onready var fall_gravity:float = ((-2.0*jump_height)/(jump_time_to_descent*jump_time_to_descent))*-1.0 func _physics_process(delta): #Code for left and right movement #var input_vector=Vector2.ZERO #input_vector.x = Input.get_action_strength("right") - Input.get_action_strength("left") #velocity = input_vector*speed #if velocity !=Vector2.ZERO: $beta_character.play_walk() #else: $beta_character.play_idle() if velocity <Vector2.ZERO: $beta_character/Sprite2D.flip_h = true else: $beta_character/Sprite2D.flip_h = false velocity.y =get_gravity()*delta if Input.is_action_just_pressed("jump") and is_on_floor(): jump() move_and_slide() func get_gravity() -> float: return jump_gravity if velocity.y < 0.0 else fall_gravity func jump(): velocity.y = jump_velocity
错误原因
- 重力应用逻辑错误:
velocity.y = get_gravity()*delta直接覆盖了y轴速度,而非累加重力加速度。按下跳跃键设置jump_velocity后,这行代码会立即替换掉跳跃速度,导致角色无法正常上升,出现瞬移。 - 方向判断逻辑错误:
if velocity < Vector2.ZERO是把整个velocity向量和零向量比较,应该只判断x轴分量velocity.x < 0,否则会出现错误的翻转逻辑。 - 重力符号混乱:Godot中y轴向下为正方向,原代码计算的重力符号逻辑混乱,可能导致重力方向错误,加剧跳跃异常。
修复后的代码
extends CharacterBody2D @export var speed = 444.44 @export var jump_height: float @export var jump_time_to_peak: float @export var jump_time_to_descent: float # 修正重力和跳跃速度的符号,适配Godot y轴向下为正的规则 @onready var jump_velocity: float = -(2.0 * jump_height) / jump_time_to_peak @onready var jump_gravity: float = (2.0 * jump_height) / (jump_time_to_peak * jump_time_to_peak) @onready var fall_gravity: float = (2.0 * jump_height) / (jump_time_to_descent * jump_time_to_descent) func _physics_process(delta): # 恢复左右移动逻辑 var input_vector = Vector2.ZERO input_vector.x = Input.get_action_strength("right") - Input.get_action_strength("left") velocity.x = input_vector.x * speed # 动画控制 if input_vector.x != 0: $beta_character.play_walk() else: $beta_character.play_idle() # 修正翻转逻辑,只判断x轴方向 $beta_character/Sprite2D.flip_h = velocity.x < 0 # 累加重力,而非直接覆盖y轴速度 velocity.y += get_gravity() * delta # 跳跃逻辑放在重力之后,确保跳跃速度能正确生效 if Input.is_action_just_pressed("jump") and is_on_floor(): jump() move_and_slide() func get_gravity() -> float: # 上升阶段用跳跃重力,下降阶段用下落重力 return jump_gravity if velocity.y < 0 else fall_gravity func jump(): velocity.y = jump_velocity
关键修复点说明
- 将
velocity.y = get_gravity()*delta改为velocity.y += get_gravity()*delta,让重力加速度逐步影响速度,而非直接重置。 - 修正重力和跳跃速度的符号,适配Godot的坐标系规则(y轴向下为正),确保上升和下落的方向正确。
- 修复角色翻转逻辑,只根据x轴速度判断左右方向。
- 恢复被注释的左右移动代码,确保角色移动功能正常。
内容的提问来源于stack exchange,提问作者SchadtMarlon
相关产品推荐
相关产品推荐

