Как остановить движение кинематографического тела при отпущенной клавише движения?

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)

Я не знаю, что делаю не так. Мое кинематическое тело продолжает двигаться после отпускания клавиши.


person Rares Cosma    schedule 09.04.2021    source источник


Ответы (1)


Обратите внимание на 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. Честно говоря, я обычно говорю Годо игнорировать это.

Иметь свой скрипт без предупреждений - хороший знак. Просмотрите их. И если вы решите, что все в порядке, вы можете сказать Годо игнорировать их (это можно сделать с помощью комментария # warning-ignore:.... См. система предупреждений GDScript). Если указать Godot игнорировать предупреждения, будет легче заметить появление нового предупреждения.


Что-то еще, я считаю, что этот код должен быть в _physics_process. Это из move_and_slide документации < / а>:

Этот метод следует использовать в Node._physics_process (или в методе, вызываемом Node._physics_process), поскольку он автоматически использует значение дельты физического шага в вычислениях. В противном случае симуляция будет работать с неверной скоростью.

person Theraot    schedule 09.04.2021
comment
Спасибо, я подумал, что _process - это то же самое, что и _physics_process, и попытался удалить _physics, но у меня это не работает. - person Rares Cosma; 09.04.2021