Roblox · Гонки · урок 5

Лобби: облёт камеры и выбор трассы

Стартовое место игры: камера плавно облетает красивую сцену по кругу, а на экране — меню с трассами. Нажал на трассу — переносишься на неё.

Структура

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

Workspace
├─ Cutscenes (Folder) — создаёт плагин Cutscene
│  └─ Cutscene (Folder)
│     └─ Cameras (Folder)
│        └─ 1, 2, 3, … (Part) — точки камеры — по порядку
└─ SpawnLocation (SpawnLocation) — под картой — персонажа не видно в кадре
StarterPlayer
└─ StarterPlayerScripts
   └─ CameraAnimation (LocalScript)
StarterGui
└─ ChooseMapGui (ScreenGui)
   └─ Frame (Frame)
      ├─ TextLabel (TextLabel) — «Выбери трассу»
      └─ Track1, Track2, … (ImageButton) — по кнопке на трассу
         └─ TeleportScript (LocalScript)

Шаги

  1. Новый плейс (шаблон из первых трёх) — это будет лобби. Оформи сцену и освещение; SpawnLocation спрячь под карту.
  2. Toolbox → Plugins → «Cutscene» → установи и открой (вкладка Plugins).
  3. Cutscene Name — «Cutscene», нажми Create Or Select Cutscene: в Workspace появится папка с камерами.
  4. Наведи камеру на красивый кадр → Capture Camera Position (или пробел): появится точка 1. Так же 2, 3… — номера идут по порядку, путь камеры — от 1 до последней и обратно к 1. Tilt — наклон кадра.
  5. Проверить кадр: выдели точку → Align Camera To Part. Если камера «залипла» — выдели любой объект и нажми F.
  6. StarterPlayer → StarterPlayerScripts → «+» → LocalScript «CameraAnimation».
  7. TweenInfo.new(время, стиль, направление, повторы, обратно, задержка): стиль Sine + InOut — мягкий разгон и торможение; Linear — ровно, Bounce — с отскоком.
  8. StarterGui → «+» → ScreenGui «ChooseMapGui» → Frame → TextLabel и по ImageButton на каждую трассу (Track1, Track2…).
  9. Узнай ID плейса трассы: открой его → Asset Manager → правой кнопкой → Copy ID. В кнопку трассы «+» → LocalScript «TeleportScript», в первой строке впиши этот ID.

Скрипты

CameraAnimation

Где: StarterPlayer → StarterPlayerScripts · LocalScript
Зачем: Плавно облетает все точки камеры по кругу.

-- плавное движение камеры
local TS = game:GetService("TweenService")
-- точки-камеры от плагина: 1, 2, 3…
local cameraFolder = workspace:WaitForChild("Cutscenes"):WaitForChild("Cutscene"):WaitForChild("Cameras")
-- камера игрока
local camera = workspace.CurrentCamera
-- секунд от одной точки до следующей
local FLY_TIME = 5

-- перелёт камеры между двумя точками
local function Fly(fromPart, toPart)
    -- мягкий разгон и торможение
    local tweenInfo = TweenInfo.new(FLY_TIME, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut)
    -- камерой управляет скрипт, а не мышь
    camera.CameraType = Enum.CameraType.Scriptable
    -- встаём в первую точку
    camera.CFrame = fromPart.CFrame
    -- движение ко второй
    local tween = TS:Create(camera, tweenInfo, {CFrame = toPart.CFrame})
    -- летим
    tween:Play()
    -- ждём, пока долетит
    tween.Completed:Wait()
-- конец функции
end

-- кадр: камера игрока успевает появиться
task.wait()
-- сколько точек расставил плагин
local count = #cameraFolder:GetChildren()
-- по кругу без конца
while true do
    -- каждая точка
    for i = 1, count do
        -- следующая; после последней — снова первая
        local nextIndex = i % count + 1
        -- летим от точки i к следующей
        Fly(cameraFolder[tostring(i)], cameraFolder[tostring(nextIndex)])
    -- конец перебора
    end
-- конец цикла
end

TeleportScript

Где: StarterGui → ChooseMapGui → Frame → Track1 · 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) и убедись: