你总是需要重力。对我有用的是让运动体在跳转代码之前下降。
extends KinematicBody
var speed=10
var gravity = 10
var jump_speed = 10
var vertical_velocity = Vector3.ZERO
var direction=Vector3.ZERO
func _physics_process(delta):
# fall
vertical_velocity += gravity * delta * Vector3.DOWN
vertical_velocity = move_and_slide(vertical_velocity, Vector3.UP)
# jump code
if is_on_floor() and Input.is_action_pressed("JUMP"):
vertical_velocity = jump_speed * Vector3.UP
direction=Vector3.ZERO
if Input.is_action_pressed("mf"):
direction-=transform.basis.z
elif Input.is_action_pressed("b"):
direction+=transform.basis.z
direction = direction.normalized()
direction = move_and_slide(direction*speed, Vector3.UP)
请注意,上面的代码允许您在空中正常移动。不知道你愿不愿意。
这里有一个版本可以在跳跃时保持方向,但不能让你在空中改变它:
extends KinematicBody
var speed=10
var gravity = 10
var jump_speed = 10
var vertical_velocity = Vector3.ZERO
var direction=Vector3.ZERO
func _physics_process(delta):
vertical_velocity += gravity * delta * Vector3.DOWN
vertical_velocity = move_and_slide(vertical_velocity, Vector3.UP)
if is_on_floor():
if Input.is_action_pressed("JUMP"):
vertical_velocity = jump_speed * Vector3.UP
if Input.is_action_pressed("mf"):
direction-=transform.basis.z
elif Input.is_action_pressed("b"):
direction+=transform.basis.z
else:
direction=Vector3.ZERO
direction = direction.normalized()
direction = move_and_slide(direction*speed, Vector3.UP)/speed
请注意,此代码只会在is_on_floor() 时设置direction=Vector3.ZERO,并且没有方向输入。
这也意味着speed 因子会累积,这就是我除以它的原因。
我们可以在这里引入这个因素:
direction = direction.normalized() * speed
然后我们可以得到这个:
direction = move_and_slide(direction, Vector3.UP)
此时direction 的名称并不准确。因为它包含了速度。我会称它为horizontal_velocity 或ground_velocity。