Сервисы Roblox: игра как дерево объектов
Находить нужные объекты в дереве игры и не ломаться о порядок загрузки.
Теория
Всё в игре — объекты Instance в одном дереве. Корень дерева — game, а его большие ветки называются сервисами: Players, Workspace, ReplicatedStorage, TweenService и десятки других.
Сервис получают через game:GetService("Players"). Именно так, а не через точку: GetService создаст сервис, если его ещё нет, и не сломается, если сервис переименуют.
Объекты внутри ищут тремя способами: точкой — когда уверен, что объект уже есть; FindFirstChild — когда его может не быть; WaitForChild — когда он появится, но позже. Ошибка «attempt to index nil» почти всегда означает, что выбрали не тот способ.
- Instance.new("Part") создаёт объект, Parent помещает его в дерево
- Свойство Parent = nil убирает объект из игры, Destroy удаляет насовсем
- GetChildren возвращает список детей, GetDescendants — всё вложенное
- WaitForChild без второго аргумента ждёт бесконечно — в клиентском коде это заметно
Пример
Скрипт создаёт деталь и находит игрока по имени.
local Players = game:GetService("Players")local ReplicatedStorage = game:GetService("ReplicatedStorage")local part = Instance.new("Part")part.Name = "Spawner"part.Size = Vector3.new(8, 1, 8)part.Position = Vector3.new(0, 10, 0)part.Anchored = truepart.Parent = workspacelocal template = ReplicatedStorage:WaitForChild("CoinTemplate", 10)if not template thenwarn("Заготовка монеты не найдена")end
Второй аргумент WaitForChild — таймаут в секундах: лучше предупредить, чем ждать вечно.
Задача
Создай в Workspace модель с тремя закреплёнными деталями разного цвета, а затем выведи в Output имена всех детей этой модели.
- Модель — тоже Instance: Instance.new("Model")
- GetChildren вернёт список, по нему пройдись через ipairs
Показать решение
local model = Instance.new("Model")model.Name = "Platforms"model.Parent = workspacelocal colors = { "Bright red", "Bright green", "Bright blue" }for index, color in ipairs(colors) dolocal part = Instance.new("Part")part.Name = "Platform" .. indexpart.BrickColor = BrickColor.new(color)part.Position = Vector3.new(index * 10, 5, 0)part.Anchored = truepart.Parent = modelendfor _, child in ipairs(model:GetChildren()) doprint(child.Name)end
Проверь себя
Почему сервис берут через GetService, а не через точку?
Показать ответ
GetService создаёт сервис при необходимости и не зависит от имени в дереве.
Что выбрать, если объект появится чуть позже?
Показать ответ
WaitForChild дождётся объекта; точка и FindFirstChild ответят сразу.