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

Godot 4.0 2D游戏角色无法跳跃问题求助

解决Godot 4.0 CharacterBody2D无法跳跃的问题

你的代码存在几个关键问题,导致跳跃功能失效,以下是具体问题和修复方案:

核心问题分析

  • 错误的移动逻辑:直接修改position.x不符合CharacterBody2D的设计规范,且跳跃时设置的velocity.y没有被正确应用到移动中。
  • 重力实现方式错误:使用move_and_collide(Vector2(0, 1*gravity))会直接施加固定位移,而非修改速度,还会覆盖跳跃时设置的垂直速度。
  • 未调用统一移动函数:CharacterBody2D需要通过move_and_slide()来处理基于velocity的移动和碰撞,你当前的代码仅在非跳跃时执行了部分移动逻辑。

修改后的完整代码

extends CharacterBody2D

var speed = 200  # 调整为更合理的移动速度
var gravity = 980  # 适配帧速率的重力值(乘以delta实现帧率无关)
const jumpForce = -400

func _physics_process(delta):
    # 处理水平移动:通过velocity控制,而非直接修改position
    var input_dir = Input.get_axis("ui_left", "ui_right")
    velocity.x = input_dir * speed

    # 应用重力:仅在空中时叠加重力
    if not is_on_floor():
        velocity.y += gravity * delta
    else:
        # 落地时重置垂直速度,避免重力持续叠加
        velocity.y = 0

    # 跳跃逻辑:限制仅在地面时可跳跃(如需二段跳可移除is_on_floor()判断)
    if Input.is_action_just_pressed("jump") and is_on_floor():
        print("trying to jump")
        velocity.y = jumpForce

    # 统一处理所有移动与碰撞
    move_and_slide()

关键修改说明

  1. 水平移动改为velocity控制:通过Input.get_axis简化左右输入逻辑,将水平方向的输入转化为velocity.x的值,符合CharacterBody2D的移动规范。
  2. 重力正确叠加到velocity:重力通过修改velocity.y并乘以delta实现帧速率无关的移动,只有在空中时才叠加重力,落地时重置垂直速度。
  3. 统一调用move_and_slide():所有移动逻辑(包括跳跃、重力、水平移动)都通过这个函数处理,它会自动应用velocity、处理碰撞,并更新角色位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:43:19