Скрипты в Roblox: сервер, клиент и модули

В Roblox код исполняется в двух местах: на сервере и на устройстве игрока. Пока непонятно, где именно работает твой скрипт, ничего не будет работать предсказуемо.

Три вида скриптов

  • Script — исполняется на сервере: раздаёт награды, считает очки, меняет мир для всех
  • LocalScript — исполняется у игрока: интерфейс, камера, реакция на нажатия
  • ModuleScript — не исполняется сам, а возвращает таблицу с функциями, которую подключают через require

Правило разделения

Всё, что влияет на игру, считает сервер. Клиент только показывает и спрашивает. Это не вкусовщина: код на устройстве игрока полностью в его руках, и решение, принятое там, доверять нельзя.

Практический вывод: LocalScript может попросить «дай мне монету», но начислять монету обязан сервер — и проверить, заслужена ли она.

Как выглядит серверный скрипт

ServerScriptService/Welcome.lua
  1. local Players = game:GetService("Players")
  2.  
  3. local function onPlayerAdded(player)
  4. print(player.Name .. " зашёл в игру")
  5.  
  6. player.CharacterAdded:Connect(function(character)
  7. local humanoid = character:WaitForChild("Humanoid")
  8. humanoid.WalkSpeed = 20
  9. end)
  10. end
  11.  
  12. Players.PlayerAdded:Connect(onPlayerAdded)

Скорость ходьбы ставит сервер: иначе её поменяет кто угодно.

Частые ошибки новичка

  • LocalScript положили в Workspace — он там не запустится
  • Обратились к объекту, который ещё не загрузился: помогает WaitForChild вместо точки
  • Забыли, что цикл while true do без ожидания вешает поток — нужен task.wait()
  • Меняют на клиенте то, что должен менять сервер, и удивляются, что другие этого не видят