Roblox · Захват флага · урок 2

Команды

Окно выбора команды: игрок жмёт «Синие» или «Красные», попадает в команду и переносится на её половину лобби.

Структура

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

Teams
├─ Синие (Team) — TeamColor Really blue, AutoAssignable выкл.
└─ Красные (Team) — TeamColor Really red, AutoAssignable выкл.
Workspace
├─ Lobby (Model)
│  └─ Neutral (SpawnLocation) — Neutral вкл. — до выбора команды
├─ LobbySpawn (Folder)
│  └─ Синие, Красные (SpawnLocation) — Neutral выкл., TeamColor команды
└─ GameSpawn (Folder) — на поле
   └─ Синие, Красные (SpawnLocation) — Neutral выкл., TeamColor команды
ReplicatedStorage
├─ TeamEvent (RemoteEvent)
└─ Lobby (BoolValue) — Value вкл.
ServerScriptService
└─ TeamsServer (Script)
StarterGui
└─ TeamGui (ScreenGui) — ResetOnSpawn выкл.
   ├─ Frame (Frame)
   │  └─ Синие, Красные (TextButton) — имя кнопки = имя команды
   └─ TeamsLocal (LocalScript)

Шаги

  1. Model → Service → Teams (если сервиса нет в Explorer). В Teams — две Team: «Синие» (TeamColor Really blue) и «Красные» (Really red). AutoAssignable выкл. — команду выбирает игрок.
  2. В лобби — SpawnLocation «Neutral» (Neutral вкл.): здесь появляются, пока команда не выбрана.
  3. Workspace → Folder «LobbySpawn»: две SpawnLocation на половинах лобби — «Синие» и «Красные», Neutral выкл., TeamColor как у команды. Такая же папка «GameSpawn» — точки на поле.
  4. ReplicatedStorage → RemoteEvent «TeamEvent» и BoolValue «Lobby» (Value вкл. — пригодится для таймера).
  5. StarterGui → ScreenGui «TeamGui» (ResetOnSpawn выкл. — иначе окно появится снова после возрождения). Внутри Frame, в нём две TextButton, названные ровно как команды: «Синие» и «Красные».
  6. LocalScript «TeamsLocal» в TeamGui, Script «TeamsServer» в ServerScriptService.
  7. Сервер проверяет, что такая команда есть: клиент может прислать что угодно.

Скрипты

TeamsLocal

Где: StarterGui → TeamGui · LocalScript
Зачем: Кнопки команд.

-- общее хранилище
local RS = game:GetService("ReplicatedStorage")
-- событие выбора команды
local teamEvent = RS:WaitForChild("TeamEvent")
-- TeamGui
local gui = script.Parent
-- окно с кнопками
local frame = gui:WaitForChild("Frame")

-- все объекты окна
for _, button in ipairs(frame:GetChildren()) do
    -- только кнопки
    if button:IsA("TextButton") then
        -- нажатие
        button.MouseButton1Click:Connect(function()
            -- имя кнопки = имя команды
            teamEvent:FireServer(button.Name)
            -- прячем окно
            gui.Enabled = false
        -- конец функции
        end)
    -- конец проверки
    end
-- конец перебора
end

TeamsServer

Где: ServerScriptService · Script
Зачем: Записывает в команду и переносит на её точку.

-- команды
local Teams = game:GetService("Teams")
-- общее хранилище
local RS = game:GetService("ReplicatedStorage")
-- событие выбора
local teamEvent = RS:WaitForChild("TeamEvent")
-- true — идёт лобби, false — игра
local lobby = RS:WaitForChild("Lobby")

-- игрок нажал кнопку
teamEvent.OnServerEvent:Connect(function(player, teamName)
    -- от клиента пришло не имя — игнорируем
    if typeof(teamName) ~= "string" then return end
    -- команда с таким именем
    local team = Teams:FindFirstChild(teamName)
    -- нет такой или игрок уже в ней
    if not team or not team:IsA("Team") or player.Team == team then return end
    -- записываем в команду
    player.Team = team
    -- лобби или поле — смотря что идёт
    local folder = lobby.Value and workspace.LobbySpawn or workspace.GameSpawn
    -- точка появления команды
    player.RespawnLocation = folder:FindFirstChild(team.Name)
    -- возрождаем там
    player:LoadCharacter()
-- конец функции
end)

Проверка

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