如何修复 3D 平台游戏的跳跃代码?

How do I fix my jump code for a 3D platformer?

我正在尝试在 Godot 中制作一个 3D 第三人称平台游戏,我正在学习在线教程。我已经按照教程中的相同方式编写了所有脚本,但我的跳跃方式不同。玩家只离开地面几厘米,然后非常缓慢地落回地面。

extends KinematicBody

var curHp : int = 10
var maxHp : int = 10
var damage : int = 1

var gold : int = 0

var attackRate : float = 0.3
var lastAttackTime : int = 0

var moveSpeed : float = 10
var jumpForce : float = 10
var gravity : float = 15

var vel : Vector3 = Vector3()

onready var camera = get_node("CameraOrbit")
onready var attackRayCast = get_node("RayCast")


func _physics_process(delta):

    vel.x = 0
    vel.y = 0

    var input = Vector3()


if Input.is_action_pressed("move_forward"):
    input.z += 1
if Input.is_action_pressed("move_backward"):
    input.z -= 1
if Input.is_action_pressed("move_left"):
    input.x += 1
if Input.is_action_pressed("move_right"):
    input.x -= 1


input = input.normalized()


var dir = (transform.basis.z * input.z + transform.basis.x * input.x)


vel.x = dir.x * moveSpeed
vel.z = dir.z * moveSpeed


vel.y -= gravity * delta

if Input.is_action_pressed("jump") and is_on_floor():
    vel.y += jumpForce


vel = move_and_slide(vel, Vector3.UP)

缩进似乎有一些不寻常的事情发生,所以有点不清楚(输入逻辑应该在 _physics_process 函数中,还是单独的?),但它看起来就像每次滴答将 y 速度重置为 0 一样。这意味着您使用 vel.y 所做的任何修改每次都会重置为 0。这意味着当你跳跃时,你向上移动重力 * delta 单位,然后 y 速度被重置回 0。之后,vel.y 被设置为 gravity * delta 并且你在 [=14 之前的每个刻度移动那么多=] 设置回 0.

您可能想要做的是在初始化程序中而不是在进程循环函数中初始化 vel.x 和 vel.y。这应该确保 y 轴上的标准物理行为。要让您的角色在您未按下按钮时停止在 x 轴上移动,您可以向物理循环添加一些代码以在 input.x 和 input.z 为 0 时加速停止。