Нажми — и деталь появится в мире
- ⏱ Сколько займёт
- 30–50 минут, 5 шагов. Каждый шаг заканчивается результатом на экране.
- 💻 Что нужно
- Компьютер с Windows или macOS. Понадобится Roblox Studio — бесплатная, поставим на первом шаге. С телефона этот квест не проходится.
- ⏸ Если прервёшься
- Ничего не потеряется: прогресс сохраняется на этом устройстве. Вернёшься — продолжишь с того же шага.
- 🎓 Чему научишься
- полёт камеры · режиссура кадра · музыка и титры
Кино внутри игры
Солнце садится, и капитан вдруг останавливает тебя рукой: «Стой. Смотри».
Минуту вы просто смотрите на закат. Потом он говорит: «Вот это и есть кино. Игрок не жмёт кнопки — он смотрит».
Полёт камеры, музыка, титры. Тридцать секунд, ради которых запоминают всю игру.
Это запись из Roblox Studio: здесь игрок как раз ничего не нажимает — камера летит сама. Такую же сцену ты соберёшь за этот квест.
Финал экспедиции. Соберём настоящую кат-сцену — вступление к твоей игре.
Первый — плагином Moon Animator: там можно анимировать сразу и персонажей, и камеру, как в настоящей монтажной программе (плагин платный, за Robux). Второй — кодом, через плавное движение камеры. Разберём оба, начнём с кода — он бесплатный и проще.
local TweenService = game:GetService("TweenService") local camera = workspace.CurrentCamera camera.CameraType = Enum.CameraType.Scriptable -- забираем управление camera.CFrame = workspace:WaitForChild("CamStart").CFrame -- ставим в начальную точку local info = TweenInfo.new( 6, -- длительность, секунд Enum.EasingStyle.Quad, -- характер движения Enum.EasingDirection.InOut -- плавный старт и финиш ) local finish = workspace:WaitForChild("CamEnd") local tween = TweenService:Create(camera, info, {CFrame = finish.CFrame}) tween:Play() tween.Completed:Wait() camera.CameraType = Enum.CameraType.Custom -- возвращаем игроку
TweenService — служба плавных переходов. Ты говоришь «отсюда — туда за шесть секунд», и она сама считает все промежуточные положения. CamStart и CamEnd — обычные невидимые Part, которые ты ставишь в нужных точках. Обращаемся к ним через workspace:WaitForChild(...), а не просто workspace.CamStart: в новых проектах детали подгружаются не мгновенно, и без ожидания скрипт упадёт с «CamStart is not a valid member of Workspace».Не забудь вернуть CameraType.Custom в конце — иначе игрок останется без камеры и не поймёт, что случилось.
Как ставить кадр
- 1Три невидимые точки в WorkspaceОбычные Part:
CamStart,CamMid,CamEnd. Расставь их по маршруту полёта камеры. - 2Свойство Transparency = 1Точки не должны быть видны в игре. Anchored — тоже true, а CanCollide выключи.
- 3Разверни каждую точкуКамера смотрит туда же, куда «смотрит» Part. Поворачивай, поглядывая в окно предпросмотра.
- 4LocalScript со сценой — не сюдаВ ServerScriptService он не заработает: камера у каждого игрока своя. Клади в StarterPlayer → StarterPlayerScripts — оттуда он забирает камеру, ведёт её по точкам и возвращает игроку.
- 5Проверь целикомИ обязательно сделай кнопку «Пропустить» — тот, кто зашёл второй раз, не хочет смотреть вступление снова.

- 1Part — три невидимые точки маршрутаПоставь три обычных блока и расставь по траектории полёта: CamStart, CamMid, CamEnd. Камера смотрит туда же, куда «смотрит» деталь, — поворачивай их инструментом Rotate.
- 2Workspace — переименуй точкиВсе три строки лежат тут. Медленный двойной клик по строке — и вписывай имя. В коде к ним обращаются через workspace:WaitForChild("CamStart"): так надёжнее, чем workspace.CamStart.
- 3Панель Properties — сделать точки невидимымиСейчас пусто, потому что ничего не выделено. Выдели точку — и ставь Transparency = 1, Anchored включён, CanCollide снят. Иначе игрок врежется в невидимый куб посреди острова.
- 4StarterPlayer → StarterPlayerScriptsРазверни треугольником. LocalScript со сценой кладут именно сюда: камера — вещь личная, у каждого игрока своя.
- 5StarterGui — титры и кнопка «Пропустить»«+» на строке → ScreenGui (это холст на весь экран), а уже внутрь него — TextLabel для титров и TextButton «Пропустить». Без ScreenGui надпись просто не нарисуется. Кнопка обрывает полёт через tween:Cancel() и возвращает CameraType = Custom.
Это настоящий экран Roblox Studio 2026 — такой же, как у тебя: та же лента вкладок, тот же Explorer со всеми сервисами, та же панель Properties. Нажимай на кружки по порядку: метка покажет место, строка ниже объяснит, зачем оно. Чего на кадре нет — про то честно написано словами. Отмечай пройденное — прогресс сохранится.
Персонажи в кадре
-- запускаем анимации у актёров ровно тогда, когда нужно local function playOn(rig, id) local humanoid = rig:WaitForChild("Humanoid") local animator = humanoid:FindFirstChildOfClass("Animator") or Instance.new("Animator", humanoid) local a = Instance.new("Animation") a.AnimationId = id local t = animator:LoadAnimation(a) t:Play() return t end playOn(workspace.Fisher, "rbxassetid://9093137352") task.wait(2) playOn(workspace.Guard, "rbxassetid://9093241065")
playOn написана один раз и работает для любого персонажа. Так и надо: заметил, что копируешь один и тот же кусок кода, — заверни его в функцию. Fisher и Guard — это имена ригов в Explorer: переименуй своих жителей (ПКМ → Rename) или подставь в код те имена, что у них уже есть. И FindFirstChildOfClass("Animator") or Instance.new(...) — подстраховка: у ригов из Toolbox Animator иногда нет, и обычный WaitForChild завис бы молча.Расставь анимации по времени: сначала рыбак машет, через две секунды стражник разворачивается. Совпадение движения с полётом камеры — это и есть режиссура.

Тридцать секунд, ради которых помнят игру
Катсцена — момент, когда игра берёт управление на себя и показывает. Пролёт над городом, первый взгляд на босса, финальный кадр.
Правила кино тут работают целиком: план, ракурс, движение камеры, музыка, монтаж. Поэтому в студиях катсценами занимаются люди с кинообразованием.
Главное ограничение — короче. Сцену, которую нельзя пропустить и которая длится три минуты, игроки ненавидят.
Звук и надписи
Sound в SoundService → запусти в начале сцены, приглуши в конце через TweenService.TextLabel в StarterGui: «Архипелаг. Триста лет спустя». Появление и исчезновение — тоже Tween по свойству TextTransparency.-- в тот же LocalScript: сразу после tween:Play(), ДО строки tween.Completed:Wait() local player = game.Players.LocalPlayer local gui = Instance.new("ScreenGui") gui.ResetOnSpawn = false gui.Parent = player:WaitForChild("PlayerGui") -- без ScreenGui надпись не появится local title = Instance.new("TextLabel", gui) title.Size = UDim2.fromScale(1, 0.2) title.Position = UDim2.fromScale(0, 0.42) title.BackgroundTransparency = 1 title.TextScaled = true title.TextColor3 = Color3.new(1, 1, 1) title.Text = "Архипелаг. Триста лет спустя" title.TextTransparency = 1 -- пока не видно local skip = Instance.new("TextButton", gui) skip.Size = UDim2.fromScale(0.22, 0.08) skip.Position = UDim2.fromScale(0.75, 0.88) skip.Text = "Пропустить" -- титры проявляются и через 4 секунды гаснут TweenService:Create(title, TweenInfo.new(1), {TextTransparency = 0}):Play() task.delay(4, function() TweenService:Create(title, TweenInfo.new(1), {TextTransparency = 1}):Play() end) skip.MouseButton1Click:Connect(function() tween:Cancel() -- обрываем полёт камеры camera.CameraType = Enum.CameraType.Custom gui:Destroy() end)
TextLabel внутри ScreenGui: положишь его прямо в StarterGui — он не отрисуется. Место в файле важное: этот кусок ставится сразу после tween:Play() и до tween.Completed:Wait() — иначе кнопка появится только когда сцена уже кончится. tween:Cancel() обрывает полёт, и ждущая строка tween.Completed:Wait() тут же отпускает камеру игроку. Чёрные полосы делаются так же — два Frame с чёрным фоном сверху и снизу экрана.Последний пункт — не мелочь, а уважение к игроку. Кат-сцена без пропуска раздражает всех.
Вступление к своей игре
И заметь, как далеко это ушло от «поставить кубик». Ты сейчас занимаешься тем же, чем занимаются люди в игровых студиях: рассказываешь историю движением.
Поднимай флаг.