Разработка игрLua / Luau

Как сделать стартовое меню в Roblox Studio: кнопка Play и камера

Делаем стартовый экран в Roblox Studio: ScreenGui, кнопка Play, фиксированная камера, плавное исчезновение и возврат управления.

Кодик

Автор

5 мин чтения

Стартовое меню состоит из ScreenGui, отдельной точки камеры и одного LocalScript. До клика Play камера смотрит на карту из заданной точки, после клика интерфейс исчезает, а камера возвращается к персонажу.

Меню не должно помещать игрока в отдельную локацию. Игрок уже на карте, но клиентская камера временно становится Scriptable. Поэтому другие игроки не замечают меню, а серверу не нужно знать о его анимации.

1Фиксируем

Переводим CurrentCamera в Scriptable и берём CFrame из MenuCamera.

2Показываем

ScreenGui перекрывает экран и предлагает одну ясную кнопку.

3Возвращаем

После Play камера переходит в Custom, а ScreenGui выключается.

Собираем объекты стартового меню

В Workspace создайте Part с именем MenuCamera. Поверните его к центру сцены, включите Anchored и выключите CanCollide. В StarterGui нужен ScreenGui с Frame, TextLabel и TextButton. Скрипт лежит внутри ScreenGui, потому что камера и UI принадлежат клиенту.

ОбъектГде лежитЗачем нужен
MenuCameraWorkspaceХранит позицию и направление
StartMenuStarterGuiКопируется каждому игроку
PlayButtonStartMenuЗапускает переход в игру
LocalScriptStartMenuМеняет UI и камеру только на этом клиенте

После этого шага у каждой части есть одна роль. Интерфейс собирает действие, логика меняет состояние, а вывод показывает признак успеха. Это проще отлаживать, чем один большой обработчик.

Переход от меню к игре
Камера и UI меняются на клиенте. Серверная логика игры не затрагивается

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

Пишем LocalScript для кнопки Play

Перед установкой CameraSubject дождитесь Character и Humanoid. Кнопка может быть нажата до полной загрузки аватара, поэтому WaitForChild здесь защищает реальный сценарий, а не маскирует ошибку.

local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")

local player = Players.LocalPlayer
local camera = workspace.CurrentCamera
local cameraPoint = workspace:WaitForChild("MenuCamera")
local screenGui = script.Parent
local panel = screenGui:WaitForChild("Panel")
local playButton = panel:WaitForChild("PlayButton")

camera.CameraType = Enum.CameraType.Scriptable
camera.CFrame = cameraPoint.CFrame

local started = false
playButton.Activated:Connect(function()
    if started then return end
    started = true
    playButton.Active = false

    local tween = TweenService:Create(
        panel,
        TweenInfo.new(0.35, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
        { BackgroundTransparency = 1 }
    )
    tween:Play()
    tween.Completed:Wait()

    local character = player.Character or player.CharacterAdded:Wait()
    local humanoid = character:WaitForChild("Humanoid")
    camera.CameraSubject = humanoid
    camera.CameraType = Enum.CameraType.Custom
    screenGui.Enabled = false
end)
Что должно работать после первого запуска

Меню видит только локальный игрок. Позиция камеры редактируется перемещением MenuCamera. Повторный клик отсекается флагом started. После анимации CameraType снова Custom.

Два режима камеры
Нужно явно переключиться между ними. Сравнение показывает, какой вариант легче поддерживать и проверять.

Как Scriptable камера возвращается к игроку

CameraType Scriptable отключает обычное управление камерой. Поэтому нельзя только скрыть ScreenGui. Если забыть Custom, игрок увидит карту, но не сможет поворачивать обзор. CameraSubject указывает, за каким Humanoid нужно следовать.

ЭтапCameraTypeScreenGui
До загрузкиScriptableEnabled
Клик PlayScriptableАнимация
ИграCustomDisabled
РеспавнCustomDisabled

Сохраняйте в одном месте то, что может измениться. Если одно и то же значение скопировано в три функции, после первой правки они начнут расходиться. Один объект состояния и одна функция отрисовки снимают эту проблему.

Смотрите на состояние, а не только на красивый экран. Перезагрузка, повторный клик, пустой ввод и медленный ответ часто открывают ошибки, которые не видны в идеальном демонстрационном проходе.

Практика: тестируем старт и респавн

Проверяйте меню в режиме Play, а не только в редакторе. CurrentCamera существует на клиенте, а событие Activated работает и с мышью, и с касанием, и с геймпадом. Отдельно сделайте Reset Character, чтобы убедиться, что меню не возвращается случайно.

Проверка своими руками
  1. Установите MenuCamera над картой и поверните его к главной сцене.
  2. Запустите Play и не трогайте кнопку 5 секунд.
  3. Нажмите Play один раз и подождите исчезновения.
  4. Поверните камеру мышью и пройдите несколько шагов.
  5. Нажмите Reset Character и дождитесь нового Humanoid.
  6. Проверьте кнопку в мобильной эмуляции Device.
Готово, если выполняются все пункты

Меню появляется до первого клика. Камера не дрожит и не перемещается за аватаром. После Play игрок полностью контролирует обзор. Повторный клик и респавн не ломают состояние.

Проверка стартового экрана
Четыре точки до публикации. Пройдите все четыре сценария перед публикацией проекта.

Доводим стартовый экран до релиза

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

Script вместо LocalScript

CurrentCamera и GUI нужно менять на клиенте.

Забыт CameraType Custom

Интерфейс исчезнет, но камера останется фиксированной.

MenuCamera не закреплен

Part упадёт под действием физики и изменит CFrame.

Два клика запускают два Tween

Флаг started должен срабать до ожидания.

Сверьтесь с первичным источником. Поведение используемых функций и ограничения примера проверяйте по документацией Roblox по камере. Документация особенно важна, когда меняются версии, политика платформы или формат ответа API.

Что получится в итоге

Готовый результат проекта: Как сделать стартовое меню в Roblox Studio: кнопка Play и камера
В итоге игрок видит чистый стартовый экран на фоне карты, а после Play сразу получает управление.

Короткие ответы
Где должен лежать скрипт?

Внутри ScreenGui в StarterGui как LocalScript.

Зачем нужен MenuCamera?

Это Anchored Part, из CFrame которого берутся позиция и направление камеры.

Почему Activated, а не MouseButton1Click?

Activated удобнее для мыши, касания и геймпада.

Как понять, что проект готов?

Он повторяет целевой сценарий несколько раз подряд, понятно реагирует на ошибочный ввод и не теряет состояние при обычных действиях.

Можно ли копировать код целиком?

Можно как стартовую точку, но сначала замените значения из примера, затем запустите проект по шагам. Если вы не можете объяснить одну строку, её лучше разобрать до следующего шага.

После меню добавьте первую игровую механику

Работу с GUI, событиями и Luau можно закрепить в курсе Lua. Более общая схема интерфейса есть в гайде про ScreenGui.

Дальше добавьте точку спавна и телепорт. Так меню станет входом в настоящий игровой цикл, а не отдельной декорацией.