Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

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


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

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`, который представляет направление, в котором наклоняется джойстик. Это значение должно быть нормализовано, чтобы представлять только направление.
Krutoy SnegovikУченик (100) 11 месяцев назад
у move_and_slide() не может быть аргументов.
Krutoy Snegovik Ученик (100) так что я просто убрал их
Krutoy SnegovikУченик (100) 11 месяцев назад
плюс теперь здесь нет элементарного движения: персонаж просто стоит на месте и вертится по направлению движения. Но так спасибо
Похожие вопросы