Урок 10 из 15

Сервисы 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 без второго аргумента ждёт бесконечно — в клиентском коде это заметно

Пример

Скрипт создаёт деталь и находит игрока по имени.

ServerScriptService/Services.lua
  1. local Players = game:GetService("Players")
  2. local ReplicatedStorage = game:GetService("ReplicatedStorage")
  3.  
  4. local part = Instance.new("Part")
  5. part.Name = "Spawner"
  6. part.Size = Vector3.new(8, 1, 8)
  7. part.Position = Vector3.new(0, 10, 0)
  8. part.Anchored = true
  9. part.Parent = workspace
  10.  
  11. local template = ReplicatedStorage:WaitForChild("CoinTemplate", 10)
  12.  
  13. if not template then
  14. warn("Заготовка монеты не найдена")
  15. end

Второй аргумент WaitForChild — таймаут в секундах: лучше предупредить, чем ждать вечно.

Задача

Создай в Workspace модель с тремя закреплёнными деталями разного цвета, а затем выведи в Output имена всех детей этой модели.

  • Модель — тоже Instance: Instance.new("Model")
  • GetChildren вернёт список, по нему пройдись через ipairs
Показать решение
ServerScriptService/Solution.lua
  1. local model = Instance.new("Model")
  2. model.Name = "Platforms"
  3. model.Parent = workspace
  4.  
  5. local colors = { "Bright red", "Bright green", "Bright blue" }
  6.  
  7. for index, color in ipairs(colors) do
  8. local part = Instance.new("Part")
  9. part.Name = "Platform" .. index
  10. part.BrickColor = BrickColor.new(color)
  11. part.Position = Vector3.new(index * 10, 5, 0)
  12. part.Anchored = true
  13. part.Parent = model
  14. end
  15.  
  16. for _, child in ipairs(model:GetChildren()) do
  17. print(child.Name)
  18. end

Проверь себя

Почему сервис берут через GetService, а не через точку?

Показать ответ

GetService создаёт сервис при необходимости и не зависит от имени в дереве.

Что выбрать, если объект появится чуть позже?

Показать ответ

WaitForChild дождётся объекта; точка и FindFirstChild ответят сразу.