如何解决如何停止运动体行走时释放运动键?
extends KinematicBody
var speed=10
var mouse_sensitivity=0.5
var direction=Vector3.ZERO
onready var head=$Head
func _ready():
if Input.is_action_pressed("ui_cancel"):
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
func _input(event):
if event is InputEventMouseMotion:
rotate_y(deg2rad(-event.relative.x*mouse_sensitivity))
head.rotate_x(deg2rad(-event.relative.y*mouse_sensitivity))
head.rotation.x=clamp(head.rotation.x,deg2rad(-90),deg2rad(90))
func _process(delta):
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()
move_and_slide(direction*speed,Vector3.UP)
我不知道我做错了什么。 释放一个键后,我的 kinematicBody 一直在移动。
解决方法
注意direction
:
var direction=Vector3.ZERO
# ...
func _process(delta):
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()
move_and_slide(direction*speed,Vector3.UP)
它以 ZERO
开头。然后您按下已识别的输入之一,并对其进行修改。输入之后不再是 ZERO
。
当然,_process
的后续执行不会进入您修改 direction
的分支。然而,direction
保留了它的价值。
无论输入如何,此行都会运行:
move_and_slide(direction*speed,Vector3.UP)
当 direction
为 ZERO
时它不会移动。但同样,在第一个输入之后 direction
不再是 ZERO
。
我相信您打算将 direction = Vector3.ZERO
写为 _process
的第一行。
我提醒你注意你的警告:
- 您没有使用
delta
。可能意味着代码不会补偿帧速率的变化。 - 你是一个独立的表达式 (
Vector3.ZERO
)。那什么都不做。你是想在那里做点什么吗? - 您正在丢弃
move_and_slide
的返回值。 老实说,我通常会告诉戈多忽略这个。
让您的脚本没有警告是一个好兆头。审查他们。如果您认为没有任何问题,您可以告诉 Godot 忽略它们(这可以通过注释 # warning-ignore:...
来完成。参见 GDScript warning system)。告诉 Godot 忽略警告会更容易在弹出新警告时注意到。
别的,我相信这段代码应该在 _physics_process
中。这是来自move_and_slide
documentation:
此方法应在 Node._physics_process(或 Node._physics_process 调用的方法)中使用,因为它会在计算中自动使用物理步骤的 delta 值。否则,模拟将以错误的速度运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。