Движение в 2D
CharacterBody2D: ввод и столкновения с препятствиями.
Движение вида сверху, без гравитации. Нужен C#-проект: настройка.
1. Создайте документ 2D
Создайте новый документ, выберите корень Entity2D, назовите его World2D и сохраните как World2D.rscene. Если редактор создал корень 3D, начните пустой документ и выберите тип корня вручную.
World2D (Entity2D)
├── Player (CharacterBody2D)
│ ├── Visual (Polygon2D)
│ └── CollisionShape2D
└── Wall (StaticBody2D)
├── Visual (Polygon2D)
└── CollisionShape2DВ 2D X увеличивается вправо, Y — вниз. Положение задаётся в пикселях координат игрового окна до масштабирования. Для этого урока камера не нужна: объекты размещены около начала координат в видимой области окна. Для проверки можно задать размер области просмотра 640 × 360 в Project Settings → Display → Window.
2. Задайте формы
У Player поставьте Position в (160, 160). У его Visual задайте в свойстве Polygon четыре точки: (-16, -16), (16, -16), (16, 16), (-16, 16). Получится квадрат 32 × 32. Выберите светлый цвет Color.
У Player/CollisionShape2D создайте RectangleShape2D и задайте его Size равным (32, 32). Локальные позиции обоих детей оставьте (0, 0).
У Wall задайте Position: (320, 160). Его Visual получает точки (-16, -80), (16, -80), (16, 80), (-16, 80) и другой цвет. В CollisionShape2D создайте RectangleShape2D с Size: (32, 160).
Слои и маски столкновений оставьте по умолчанию. Polygon2D виден в игре, но сам по себе не останавливает персонажа: для этого нужна Shape внутри физического тела.
3. Настройте ввод
В Project → Project Settings → Input Map добавьте move_left, move_right, move_up, move_down и привяжите A/D/W/S или соответствующие стрелки. Если действия влево и вправо уже созданы в 3D-уроке, используйте существующие. Здесь вертикальные действия называются move_up и move_down.
4. Добавьте Player2D.cs
Прикрепите к Player скрипт Scripts/Player2D.cs на основе CharacterBody2D:
using Reckfell;
public partial class Player2D : CharacterBody2D
{
[Export] public float Speed { get; set; } = 220.0f;
public override void _PhysicsProcess(double delta)
{
Vector2 direction = Input.GetVector("move_left", "move_right", "move_up", "move_down");
Velocity = direction * Speed;
MoveAndSlide();
}
}Сохраните, соберите C# и нажмите F6. Щёлкните по игровому окну. Квадрат должен двигаться и упираться в стену.
Скорость и столкновения
Speed здесь измеряется в пикселях за секунду в координатах мира 2D. Это не то же значение масштаба, что 4 единицы в секунду из 3D-урока. MoveAndSlide() уже учитывает физический шаг, поэтому скорость не умножается на delta.
В этом примере нет гравитации: движение одинаково во всех направлениях. Для платформера понадобятся отдельная вертикальная скорость, гравитация и проверка пола, как в 3D-контроллере, но с API 2D.
Если объект не виден, проверьте Polygon, непрозрачность и позицию. Если нет столкновений — Shape у обоих тел. Решение проблем.