首页 > 解决方案 > 如何在释放运动键时停止运动体行走?

问题描述

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 继续移动。

标签: godot

解决方案


注意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 忽略这一点。

让您的脚本没有警告是一个好兆头。审查他们。如果您认为没有任何问题,您可以告诉 Godot 忽略它们(这可以通过注释来完成# warning-ignore:...。请参阅GDScript 警告系统)。告诉 Godot 忽略警告将在弹出新警告时更容易注意到。


别的,我相信这段代码应该在_physics_process. 这是来自move_and_slide文档

此方法应在 Node._physics_process 中使用(或在 Node._physics_process 调用的方法中),因为它在计算中自动使用物理步骤的 delta 值。否则,模拟将以不正确的速度运行。


推荐阅读