Нажми — и увидишь, что делает команда
- ⏱ Сколько займёт
- 30–50 минут, 5 шагов. Каждый шаг заканчивается результатом на экране.
- 💻 Что нужно
- Компьютер с Windows или macOS. Понадобится Godot — бесплатный, поставим на первом шаге. С телефона этот квест не проходится.
- ⏸ Если прервёшься
- Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
- 🎓 Чему научишься
- захват мыши · движение в 3D · физические тела
Камера становится глазами
Тео протягивает медный шлем ныряльщика: «Смотреть на героя со стороны — это про кино. А теперь ты будешь смотреть его глазами».
В шлеме мир сужается до круглого окна. Куда повернул голову — туда и идёшь.
«Под водой это единственный способ. Со стороны ты не увидишь, куда плыть».
Label и global_position.distance_to(кристалл).Это записано в самом Godot — движок посчитал физику и нарисовал каждый кадр. К концу квеста такая же игра будет запускаться у тебя.
Читать текстом
Самая узнаваемая схема управления в играх — и всего около двадцати строк кода.
Два пункта, без которых герой провалится: у CollisionShape3D в Инспекторе задай Shape → New CapsuleShape3D (высота ~2, радиус ~0,4), а самому Player поставь Position Y = 2 — пусть появится над землёй, а не в ней.
Почему камера не прицеплена к телу напрямую? Потому что смотреть вверх и поворачиваться — разные движения. Тело крутится вокруг себя влево-вправо, а голова кивает вверх-вниз. Разделишь их — получится правильно. Не разделишь — герой начнёт заваливаться набок.
Мышь смотрит
extends CharacterBody3D @export var mouse_sensitivity: float = 0.002 func _ready() -> void: Input.mouse_mode = Input.MOUSE_MODE_CAPTURED # курсор спрятан и захвачен func _input(event: InputEvent) -> void: if event is InputEventMouseMotion: rotate_y(-event.relative.x * mouse_sensitivity) # тело влево-вправо $Head.rotate_x(-event.relative.y * mouse_sensitivity) # голова вверх-вниз $Head.rotation.x = clamp($Head.rotation.x, -1.4, 1.4) # шею не свернуть
MOUSE_MODE_CAPTURED прячет курсор и отдаёт игре все движения мыши — как в любом шутере. event.relative — насколько мышь сдвинулась с прошлого кадра. clamp не даёт голове запрокинуться за спину.Минусы перед значениями не случайны: без них мышь будет работать наоборот. Такую настройку, кстати, называют «инверсия» и в больших играх выносят в меню.
if event.is_action_pressed("ui_cancel"):
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
Теперь Esc возвращает курсор. Без этой строки придётся закрывать игру через диспетчер задач.
WASD и прыжок
@export var speed: float = 5.0 # метров в секунду @export var jump_speed: float = 5.0 @export var gravity: float = 9.8 # как на Земле func _physics_process(delta: float) -> void: if not is_on_floor(): velocity.y -= gravity * delta # в 3D вниз — это МИНУС Y if is_on_floor() and Input.is_action_just_pressed("jump"): velocity.y = jump_speed # а вверх — плюс var input := Input.get_vector("move_left", "move_right", "move_forward", "move_back") var dir := (transform.basis * Vector3(input.x, 0, input.y)).normalized() velocity.x = dir.x * speed velocity.z = dir.z * speed move_and_slide()
get_vector читает сразу четыре клавиши и выдаёт направление. Умножение на transform.basis поворачивает это направление вслед за героем — иначе W всегда вёл бы на север, куда бы ты ни смотрел. normalized() уравнивает скорость по диагонали.Не забудь создать действия move_forward, move_back, move_left, move_right, jump в Карте действий (Проект → Настройки проекта; в русской локали вкладка может называться «Список действий», по-английски Input Map).
Если 3D-мир из седьмого квеста ты собирал в том же проекте platformer, то move_left, move_right и jump там уже есть — допиши только move_forward и move_back. Если завёл новый проект — придётся создать все пять заново: Карта действий у каждого проекта своя.
Герой ходит, но странно: куда бы ты ни повернул мышь, W ведёт всегда в одну сторону. Найди строку с ошибкой.

Почему от первого лица страшнее
Вид от первого лица забирает у игрока периферийное зрение. Ты не видишь, что за спиной, — и мозг честно тревожится.
Хорроры этим пользуются: в Roblox-хите Doors ты почти всегда смотришь глазами героя, и вся игра построена на том, что сзади может кто-то быть.
А в играх про исследование, наоборот, добавляют вид от третьего лица: там важнее видеть мир, а не бояться его.
Мир становится твёрдым
MeshInstance3D → меню сверху Меш → Создать форму столкновения…. Откроется окошко: Размещение — «Статическое тело (дочерний)», Тип — «Трисетка» (Trimesh) → ОК. Godot сам построит форму по мешу.RigidBody3D → внутрь MeshInstance3D с BoxMesh и CollisionShape3D с BoxShape3D того же размера. Подними ящик на метр над землёй, иначе он родится внутри пола и его вытолкнет. Толкни героем — разлетятся.Физические ящики — простой трюк, от которого мир сразу оживает. Их можно сбивать, ставить друг на друга и залезать по ним туда, куда не допрыгнуть.
Три типа тел — те же, что были в 2D, только с тройкой на конце. Выбор всегда по вопросу: «кто этим управляет — никто, физика или код?»
Дойди до кристалла

- 1Player и его дети — сборка ныряльщикаPlayer — это CharacterBody3D. Внутри форма столкновения (в Инспекторе Shape → New CapsuleShape3D: капсула похожа на человека) и камера. Важно: на кадре Camera3D висит прямо на герое, а тебе нужен между ними пустой Node3D по имени Head. Тело крутится влево-вправо, голова кивает вверх-вниз; не разделишь — герой начнёт заваливаться набок.
- 2Значок камеры — это и есть глазаПока камера смотрит на героя со стороны — это вид «кино». Перетащи её в голову ящика, примерно на 1,6 метра над полом: столько до глаз у человека. Тонкие сиреневые линии, что расходятся от значка, — её пирамида обзора: всё, что попадает внутрь, увидит игрок.
- 3Серый ящик — твой герой, пока без моделиВ 3D сначала делают «серую коробку» и проверяют, приятно ли ходить, а красивую модель приделывают потом. Зелёная стрелка гизмо смотрит вверх: в 3D вверх — это плюс Y, поэтому прыжок стал +5, хотя в 2D был −500.
- 4Панель инструментов — тут появится меню «Меш»Выдели землю Ground — и рядом с «Преобразование» и «Вид» вылезет ещё одно меню, «Меш». В нём пункт про форму столкновения: Godot сам обведёт землю невидимой оболочкой, и герой перестанет проваливаться. На кадре этого меню нет, потому что выделен не меш. То же самое сделай каждой скале.
- 5Правый док: «Сигналы», а рядом «Инспектор»Поля speed, jump_speed и mouse_sensitivity появятся в «Инспекторе». На кадре открыта соседняя вкладка «Сигналы»: панель узкая, и вкладки прокручиваются стрелками в её правом верхнем углу. И помни — крутить эти числа надо на остановленной игре: правки в редакторе на уже запущенную игру не действуют.
Это настоящий экран Godot, вкладка 3D: слева дерево объёмной сцены, в центре мир с землёй, холмом и героем-ящиком, а на нём — гизмо из трёх стрелок. Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно.
Читать текстом
Задание Гильдии: сделай режим полёта для отладки. Одна клавиша — и гравитация выключается, пробел поднимает, Shift опускает. Разработчики так осматривают свои уровни.
Поднимай флаг.