Ваш код содержит несколько проблем, которые могут привести к хаотичному вращению персонажа.
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`, который представляет направление, в котором наклоняется джойстик. Это значение должно быть нормализовано, чтобы представлять только направление.
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()