К карте
ОСТРОВ КУЗНИ · GODOT · КВЕСТ 8
Глазами ныряльщика
0
Прогресс0 / 5
СДЕЛАЙ ПЕРВЫЙ ХОД

Нажми — и увидишь, что делает команда

Жми кнопки по очереди — это три настоящие команды.
ПЕРЕД СТАРТОМ
⏱ Сколько займёт
30–50 минут, 5 шагов. Каждый шаг заканчивается результатом на экране.
💻 Что нужно
Компьютер с Windows или macOS. Понадобится Godot — бесплатный, поставим на первом шаге. С телефона этот квест не проходится.
⏸ Если прервёшься
Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
🎓 Чему научишься
захват мыши · движение в 3D · физические тела
ШАГ 1 ИЗ 5 · ОСТРОВ КУЗНИ · GODOT · КВЕСТ 8

Камера становится глазами

ЧТО ПРОИСХОДИТ
ЭПИЗОД 8Пролив

Тео протягивает медный шлем ныряльщика: «Смотреть на героя со стороны — это про кино. А теперь ты будешь смотреть его глазами».

В шлеме мир сужается до круглого окна. Куда повернул голову — туда и идёшь.

«Под водой это единственный способ. Со стороны ты не увидишь, куда плыть».

мастер Тео · кузнец Острова Кузни
ЧТО ПОЛУЧИТСЯ
ЗАПИСЬ ГОТОВОЙ ИГРЫ
Мир от первого лица: куда повернул голову — туда и идёшь. Под водой смотреть можно только своими глазами. В ролике есть ещё виньетка шлема, фонарь и счётчик метров до кристалла — это Задание Гильдии; счётчик, кстати, всего три строки: Label и global_position.distance_to(кристалл).

Это записано в самом Godot — движок посчитал физику и нарисовал каждый кадр. К концу квеста такая же игра будет запускаться у тебя.

СНАЧАЛА — ПОСМОТРИ
ЖИВАЯ ЗАПИСЬ ДВИЖКА
Мышь вертит головой, WASD ведёт вперёд, пробел подбрасывает. Это управление знает каждый, кто играл в шутеры — и сегодня ты соберёшь его сам.
Мастер Тео
Читать текстом
Ныряльщик, надевай шлем. Смотреть на героя со стороны — это про кино, а сегодня ты будешь смотреть его глазами. Секрет сборки такой: камеру нельзя вешать прямо на тело. Тело крутится влево-вправо, а голова кивает вверх-вниз, и это разные движения — жить они должны на разных узлах. Не разделишь — герой заваливается набок. Соберёшь управление, которое знает каждый, кто играл в шутеры.

Самая узнаваемая схема управления в играх — и всего около двадцати строк кода.

ЗАДАНИЕ 1 · СБОРКА ГЕРОЯ
Player · CharacterBody3D
  ├─ CollisionShape3D · капсула — тело героя
  └─ Head · Node3D — шея, крутится вверх-вниз
       └─ Camera3D · глаза

Два пункта, без которых герой провалится: у CollisionShape3D в Инспекторе задай Shape → New CapsuleShape3D (высота ~2, радиус ~0,4), а самому Player поставь Position Y = 2 — пусть появится над землёй, а не в ней.

Почему камера не прицеплена к телу напрямую? Потому что смотреть вверх и поворачиваться — разные движения. Тело крутится вокруг себя влево-вправо, а голова кивает вверх-вниз. Разделишь их — получится правильно. Не разделишь — герой начнёт заваливаться набок.

ШАГ 2 ИЗ 5 · ОСТРОВ КУЗНИ · GODOT · КВЕСТ 8

Мышь смотрит

ЗАДАНИЕ 2 · ОБЗОР
player.gdGDSCRIPT
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 возвращает курсор. Без этой строки придётся закрывать игру через диспетчер задач.
Зачем голова (Head) — отдельный узел, а не сама камера внутри тела?
Так красивее в дереве
Чтобы кивок вверх-вниз не заваливал всё тело набок
Камера не может быть ребёнком CharacterBody3D
ШАГ 3 ИЗ 5 · ОСТРОВ КУЗНИ · GODOT · КВЕСТ 8

WASD и прыжок

ЗАДАНИЕ 3 · ХОДЬБА
player.gdGDSCRIPT
@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. Если завёл новый проект — придётся создать все пять заново: Карта действий у каждого проекта своя.

В 2D прыжок был −500, а здесь +5. Почему знак поменялся?
В 3D другая физика
В 3D ось Y смотрит вверх, а в 2D смотрела вниз
Опечатка в уроке
НАЙДИ ОШИБКУ
player.gdнажми на строку с ошибкой
1func _physics_process(delta: float) -> void:
2 if not is_on_floor():
3 velocity.y -= gravity * delta
4
5 var input := Input.get_vector("move_left","move_right","move_forward","move_back")
6 var dir := Vector3(input.x, 0, input.y).normalized()
7 velocity.x = dir.x * speed
8 velocity.z = dir.z * speed
9 move_and_slide()
Герой ходит, но куда бы ни смотрел — W ведёт всегда в одну сторону.

Герой ходит, но странно: куда бы ты ни повернул мышь, W ведёт всегда в одну сторону. Найди строку с ошибкой.

ЭКСКУРС
КАК В НАСТОЯЩИХ ИГРАХ

Почему от первого лица страшнее

Вид от первого лица забирает у игрока периферийное зрение. Ты не видишь, что за спиной, — и мозг честно тревожится.

Хорроры этим пользуются: в Roblox-хите Doors ты почти всегда смотришь глазами героя, и вся игра построена на том, что сзади может кто-то быть.

А в играх про исследование, наоборот, добавляют вид от третьего лица: там важнее видеть мир, а не бояться его.

ШАГ 4 ИЗ 5 · ОСТРОВ КУЗНИ · GODOT · КВЕСТ 8

Мир становится твёрдым

ЗАДАНИЕ 4 · ФИЗИКА
1
Земля
Выдели её MeshInstance3D → меню сверху Меш → Создать форму столкновения…. Откроется окошко: Размещение — «Статическое тело (дочерний)», Тип — «Трисетка» (Trimesh) → ОК. Godot сам построит форму по мешу.
2
Скалы и стены
То же самое каждой — для выпуклых камней быстрее «Одиночная выпуклая». Без этого герой пройдёт сквозь них как призрак.
3
Проверь
Запусти и походи. Если проваливаешься под землю — забыл про статичное тело.
4
Ящики, которые падают
Дерево ящика: RigidBody3D → внутрь MeshInstance3D с BoxMesh и CollisionShape3D с BoxShape3D того же размера. Подними ящик на метр над землёй, иначе он родится внутри пола и его вытолкнет. Толкни героем — разлетятся.

Физические ящики — простой трюк, от которого мир сразу оживает. Их можно сбивать, ставить друг на друга и залезать по ним туда, куда не допрыгнуть.

ТРИ ТЕЛА В 3D
НЕ ДВИГАЕТСЯ НИКОГДА
StaticBody3D
Земля, скалы, стены. Дёшево для компьютера.
ДВИГАЕТСЯ ПО ФИЗИКЕ
RigidBody3D
Ящики, бочки, мусор. Падают и катятся сами.
ДВИГАЕТСЯ ПО КОДУ
CharacterBody3D
Герой и враги. Слушаются команд, а не физики.

Три типа тел — те же, что были в 2D, только с тройкой на конце. Выбор всегда по вопросу: «кто этим управляет — никто, физика или код?»

ШАГ 5 ИЗ 5 · ОСТРОВ КУЗНИ · GODOT · КВЕСТ 8

Дойди до кристалла

НАСТОЯЩИЙ ЭКРАН GODOT — КУДА НАЖИМАТЬ
ТВОЙ ЭКРАН GODOT — КУДА НАЖИМАТЬнажми на кружок — покажу место
Окно редактора
  • 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 появятся в «Инспекторе». На кадре открыта соседняя вкладка «Сигналы»: панель узкая, и вкладки прокручиваются стрелками в её правом верхнем углу. И помни — крутить эти числа надо на остановленной игре: правки в редакторе на уже запущенную игру не действуют.
Отмечено:0 из 5

Это настоящий экран Godot, вкладка 3D: слева дерево объёмной сцены, в центре мир с землёй, холмом и героем-ящиком, а на нём — гизмо из трёх стрелок. Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно.

МАСТЕР ТЕО · ГИЛЬДИЯ РАЗРАБОТЧИКОВ
У тебя работающий FPS-герой: мышь смотрит, WASD ведёт, гравитация тянет, мир твёрдый. Это ровно та основа, на которой построены все шутеры от первого лица.
Мастер Тео
Читать текстом
У тебя работающий герой от первого лица: мышь смотрит, клавиши ведут, гравитация тянет, мир стал твёрдым. Ровно на этой основе построены все шутеры. И заметь, что дала одна строчка с clamp: шею герою больше не свернуть. Дальше — затонувший храм, гарпуномёт в руках и финал экспедиции.

Задание Гильдии: сделай режим полёта для отладки. Одна клавиша — и гравитация выключается, пробел поднимает, Shift опускает. Разработчики так осматривают свои уровни.

Поднимай флаг.

Квест пройден!

FPS-герой ходит, смотрит мышью, прыгает и не проваливается сквозь землю. Печать СЛЕДОПЫТ.

Что дальше. Под водой, в двадцати метрах, стоят колонны. Между ними шевелится что-то большое.

🏅 Забрать диплом Следующий квест: Затонувший храм
🔒

Этот остров ещё закрыт

Сначала пройди предыдущий квест — хотя бы просмотри все шаги.

⚑ Экспедиционный режим