Управление через Input Map
Настройте действия движения, получите вектор ввода и отделите управление от меню.
Создайте действия
Откройте Project → Project Settings → Input Map. Добавьте имена без пробелов и с точным регистром:
| Действие | Клавиша |
|---|---|
move_left | A или стрелка влево |
move_right | D или стрелка вправо |
move_up | W или стрелка вверх |
move_down | S или стрелка вниз |
Одному действию можно назначить несколько клавиш и кнопки геймпада. Игра читает имя действия, а не конкретную раскладку.
Двигайте объект
Создайте Sprite2D с текстурой в пределах окна, например в (320, 180). Прикрепите MoveMarker.cs, соберите C# и запустите текущий префаб с F6:
using Reckfell;
public partial class MoveMarker : Entity2D
{
[Export] public float Speed { get; set; } = 250.0f;
public bool GameplayEnabled { get; set; } = true;
public override void _PhysicsProcess(double delta)
{
if (!GameplayEnabled)
return;
Vector2 direction = Input.GetVector(
"move_left", "move_right", "move_up", "move_down");
Position += direction * Speed * (float)delta;
}
}При Speed = 250 объект проходит 250 пикселей за секунду вдоль одной оси. GetVector() ограничивает длину вектора единицей: диагональ не ускоряет движение. Для аналогового стика функция также учитывает мёртвую зону.
Этот пример напрямую меняет положение и не обрабатывает столкновения. Для персонажа со стенами используйте CharacterBody2D, Velocity и MoveAndSlide() из примера 2D. В 3D выбирайте CharacterBody3D.
Удержание и одиночное нажатие
Input.IsActionPressed() возвращает состояние удержания. Input.IsActionJustPressed() сообщает о начале нажатия в текущем кадре или физическом такте; вызов не «забирает» нажатие у другого скрипта. Для реакции после обработки интерфейсом используйте _UnhandledInput() и InputEvent.IsActionPressed().
Открытое меню само по себе не блокирует опрос Input. Установите GameplayEnabled = false из контроллера меню или приостанавливайте игровую ветку дерева. Порядок обработки событий.
Если управление не работает
- Проверьте, что окно игры получило фокус.
- Сверьте все четыре имени действий с кодом; их создание не назначает клавиши автоматически.
- Проверьте прикрепление скрипта, сборку и
GameplayEnabled. - Не умножайте
CharacterBody2D.VelocityнаdeltaпередMoveAndSlide(): скорость задаётся в пикселях в секунду, а шаг учитывает само движение.