Roblox · Сбор-а-тон · урок 5

Телепорты

Карта большая — добавим быстрые перемещения: список мест с картинками, клик переносит туда.

Структура

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

Workspace
└─ Teleports (Folder)
   └─ Лес (Part) — площадка, имя = название места
      └─ Decal (Decal) — картинка места
StarterGui
└─ ListGui (ScreenGui)
   ├─ TeleportButton (TextButton) — «Карта»
   ├─ TeleportFrame (Frame) — Visible выкл.
   │  └─ ScrollingList (ScrollingFrame) — UIGridLayout
   │     └─ Sample (Frame) — шаблон: LocationImage (ImageButton), LocationName
   └─ TeleportLocal (LocalScript)

Шаги

  1. Workspace → Folder «Teleports»: в каждой зоне площадка (Anchored), имя — название места. В неё Decal с картинкой.
  2. В ListGui — кнопка «TeleportButton» и «TeleportFrame» с ScrollingList и шаблоном Sample: ImageButton «LocationImage», TextLabel «LocationName».
  3. LocalScript «TeleportLocal» в ListGui. Персонажа игрок переносит сам: он управляет своим персонажем, и сервер увидит перенос.
  4. PivotTo переносит модель целиком. В методичке менялся Position у PrimaryPart — так персонаж разваливается.

Скрипты

TeleportLocal

Где: StarterGui → ListGui · LocalScript
Зачем: Список мест и перенос.

-- игроки
local Players = game:GetService("Players")
-- этот игрок
local player = Players.LocalPlayer
-- точки телепорта
local teleports = workspace:WaitForChild("Teleports")
-- ListGui
local gui = script.Parent
-- кнопка карты
local button = gui:WaitForChild("TeleportButton")
-- список мест
local frame = gui:WaitForChild("TeleportFrame")
-- прокрутка
local scrolling = frame:WaitForChild("ScrollingList")
-- шаблон
local sample = scrolling:WaitForChild("Sample")

-- кнопка
button.MouseButton1Click:Connect(function()
    -- открыть / закрыть
    frame.Visible = not frame.Visible
-- конец функции
end)

-- каждое место
for _, point in ipairs(teleports:GetChildren()) do
    -- копия шаблона
    local card = sample:Clone()
    -- имя
    card.Name = point.Name
    -- подпись
    card.LocationName.Text = point.Name
    -- картинка места
    local decal = point:FindFirstChildOfClass("Decal")
    -- на кнопку
    card.LocationImage.Image = decal and decal.Texture or ""
    -- фон — цвет площадки
    card.LocationImage.BackgroundColor3 = point.Color
    -- показываем
    card.Visible = true
    -- в список
    card.Parent = scrolling
    -- клик по месту
    card.LocationImage.MouseButton1Click:Connect(function()
        -- персонаж
        local character = player.Character
        -- он есть
        if character and character:FindFirstChild("HumanoidRootPart") then
            -- переносим целиком над площадкой
            character:PivotTo(point.CFrame + Vector3.new(0, 4, 0))
            -- закрываем список
            frame.Visible = false
        -- конец проверки
        end
    -- конец функции
    end)
-- конец перебора
end

Проверка

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