Top.Mail.Ru
Ответы

Программирование, язык GDScript, движок Godot Engine 4

Мне нужно, чтобы персонаж двигался по направлению движения, но с этим кодом происходит хаотичное вращение без закономерностей. Сделано с джойстиком. Помогите пожалуйста


extends CharacterBody2D

@export var speed : float = 200

var direction : Vector2 = Vector2.ZERO

@export var joystick_left : VirtualJoystick

@export var joystick_right : VirtualJoystick

var move_vector := Vector2.ZERO

func _process(delta: float) -> void:
move_vector.x = Input.get_axis("ui_left", "ui_right")
move_vector.y = Input.get_axis("ui_up", "ui_down")
position += move_vector * speed * delta
move_and_slide()
look_at(direction)

if joystick_right and joystick_ right.is _pressed:
rotation = joystick_right.output.angle()

По дате
По рейтингу
Аватар пользователя
Мудрец

Ваш код содержит несколько проблем, которые могут привести к хаотичному вращению персонажа.

1. `look_at(direction)` - эта функция заставляет объект смотреть на определенную точку, `direction` должен быть вектором направления, в которое вы хотите смотреть. Однако, в коде `direction` не изменяется и остается нулевым вектором ` Vector2.ZERO `, что делает его бесполезным для этой задачи.

2. `rotation = joystick_right.output.angle()` - эта строка непосредственно изменяет вращение объекта на угол джойстика, но выполняется только при условии, что джойстик нажат. Вам, скорее всего, требуется изменять направление движения персонажа, а не только его вращение.

3. `move_and_slide()` - эта функция должна вызываться с аргументом вектора движения, чтобы перемещать объект. Вы вызываете `move_and_slide()` без аргументов.

Вот исправленная версия кода, которая должна работать корректно:

``extends CharacterBody2D

@export var speed : float = 200

var move_vector := Vector2.ZERO

@export var joystick_left : VirtualJoystick
@export var joystick_right : VirtualJoystick

func _process(delta: float) -> void:
move_vector = Vector2.ZERO # Обнуляем вектор при каждом обновлении кадра

# Отвечает за движение, используя джойстик или клавишы как входные данные.
if joystick_left:
move_vector = joystick_left.output # Или, если вы используете оси: Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
else:
move_vector.x = Input.get_axis("ui_left", "ui_right")
move_vector.y = Input.get_axis("ui_up", "ui_down")

if move_vector.length() > 0:
move_vector = move_vector.normalized() * speed
move_and_slide(move_vector) # Передаем вектор движения в эту функцию
look_at(position + move_vector) # Заставляем персонажа смотреть по направлению движения

# Отвечает за вращение, используя второй джойстик.
if joystick_right and joystick_right.is_pressed:
rotation = joystick_right.output.angle() # Поворачиваем персонажа на угол, соответствующий джойстику.

```
Здесь происходят следующие изменения:

- Для движения вы используете `move_vector`, который вычисляется либо на основании виртуального джойстика (если он есть), либо на основании стандартных осей.
- Функция `move_and_slide()` использует `move_vector` для движения объекта.
- Вызов `look_at()` модифицирован, чтобы персонаж смотрел по направлению движения, добавляя `move_vector` к текущей позиции, чтобы определить, куда смотреть.
- Убедитесь, что `joystick_left.output` и `joystick_right.output` возвращают `Vector2`, который представляет направление, в котором наклоняется джойстик. Это значение должно быть нормализовано, чтобы представлять только направление.