Roblox · 2D Раннер · урок 5

Главное меню

Отдельный плейс со стартовым экраном: камера медленно вращается над красивой сценой, на экране — название игры и кнопка «Играть», которая переносит в забег.

Структура

Синим — что добавляем на этом уроке.

Workspace
├─ CameraPart (Part) — Anchored, прозрачная; верх смотрит вверх
└─ SpawnLocation (SpawnLocation) — под картой — персонажа не видно в кадре
StarterPlayer
└─ StarterPlayerScripts
   └─ CameraScript (LocalScript)
StarterGui
└─ PlayGui (ScreenGui)
   └─ Frame (Frame)
      ├─ TextLabel (TextLabel) — название игры и автор
      └─ PlayButton (TextButton) — «Играть»
         └─ PlayScript (LocalScript)

Шаги

  1. File → New → новый плейс (шаблон из первых трёх). Оформи декорации — это фон меню.
  2. В центре сцены поставь деталь «CameraPart»: Anchored — вкл., Transparency — 1. По Orientation Indicator проверь: верх детали смотрит вверх, перед — туда, откуда начнётся облёт.
  3. SpawnLocation спрячь под карту — персонаж не попадёт в кадр.
  4. StarterPlayer → StarterPlayerScripts → «+» → LocalScript «CameraScript».
  5. TweenService плавно меняет числа: позицию, размер, прозрачность, CFrame. TweenInfo — длительность, стиль (Linear — ровно, Sine — мягко), направление. Круг делим на три поворота по 120°: твин на 360° сразу не сработает — начало и конец совпадают.
  6. StarterGui → «+» → ScreenGui «PlayGui» → Frame → TextLabel (название и автор) и TextButton «PlayButton».
  7. Обе карты сохрани в Roblox как места одной игры. Открой плейс с забегом → View → Asset Manager → Places → правой кнопкой по плейсу → Copy ID to Clipboard.
  8. В PlayButton «+» → LocalScript «PlayScript», в первой строке впиши скопированный ID.

Скрипты

CameraScript

Где: StarterPlayer → StarterPlayerScripts · LocalScript
Зачем: Медленно вращает камеру вокруг CameraPart.

-- плавные изменения
local TS = game:GetService("TweenService")
-- камера игрока
local camera = workspace.CurrentCamera
-- точка, откуда снимаем
local cameraPart = workspace:WaitForChild("CameraPart")
-- треть круга за 20 секунд, ровно, без разгона
local tweenInfo = TweenInfo.new(20, Enum.EasingStyle.Linear)

-- кадр: камера игрока успевает появиться
task.wait()
-- встаём в точку съёмки
camera.CFrame = cameraPart.CFrame
-- крутимся без конца
while true do
    -- камерой управляет скрипт
    camera.CameraType = Enum.CameraType.Scriptable
    -- повернуться на 120° вокруг вертикали
    local goal = {CFrame = camera.CFrame * CFrame.Angles(0, math.rad(120), 0)}
    -- анимация поворота
    local tween = TS:Create(camera, tweenInfo, goal)
    -- запускаем
    tween:Play()
    -- ждём конца — и следующая треть круга
    tween.Completed:Wait()
-- конец цикла
end

PlayScript

Где: StarterGui → PlayGui → Frame → PlayButton · LocalScript
Зачем: По нажатию переносит игрока в забег.

-- ID плейса с забегом — вставь свой из Asset Manager
local PLACE_ID = 0
-- кнопка «Играть»
local button = script.Parent
-- перенос между плейсами
local TeleportService = game:GetService("TeleportService")
-- игрок, который нажал
local player = game.Players.LocalPlayer

-- нажали «Играть»
button.MouseButton1Click:Connect(function()
    -- прячем меню
    button.Parent.Visible = false
    -- переносим в забег
    TeleportService:Teleport(PLACE_ID, player)
-- конец обработчика
end)

Проверка

Запусти Play (или Run) и убедись: