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

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

错误原因

  1. 重力应用逻辑错误:velocity.y = get_gravity()*delta直接覆盖了y轴速度,而非累加重力加速度。按下跳跃键设置jump_velocity后,这行代码会立即替换掉跳跃速度,导致角色无法正常上升,出现瞬移。
  2. 方向判断逻辑错误:if velocity < Vector2.ZERO是把整个velocity向量和零向量比较,应该只判断x轴分量velocity.x < 0,否则会出现错误的翻转逻辑。
  3. 重力符号混乱: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:05:14