События: код, который ждёт, а не опрашивает
Подписываться на события движка и не плодить лишние подписки.
Теория
Событие — сигнал «что-то случилось»: игрок зашёл, деталь коснулась другой, кнопка нажата. Вместо того чтобы проверять это в цикле, код подписывается функцией через Connect и ждёт, пока его позовут.
Connect возвращает соединение. Пока оно живо, функция будет вызываться. Disconnect обрывает подписку — это важно, потому что забытые подписки накапливаются и держат объекты в памяти.
Wait останавливает выполнение до ближайшего срабатывания и возвращает его аргументы. Своё событие внутри одной стороны делают через BindableEvent, между сервером и клиентом — через RemoteEvent.
- Обработчик получает те же аргументы, которые передаёт событие
- Touched срабатывает много раз подряд — нужна защита от повторов
- Одно событие может иметь сколько угодно подписчиков
- Подписки внутри цикла — верный способ подписаться сто раз
Пример
Деталь награждает игрока при касании, но не чаще раза в секунду.
local pad = workspace:WaitForChild("CoinPad")local busy = falselocal connection = pad.Touched:Connect(function(hit)if busy thenreturnendlocal humanoid = hit.Parent and hit.Parent:FindFirstChild("Humanoid")if not humanoid thenreturnendbusy = trueprint("Награда выдана")task.wait(1)busy = falseend)
Переменная connection пригодится, когда подписку нужно будет оборвать.
Задача
Подпишись на вход игрока в игру и выведи его имя. Через десять секунд после входа обработчик должен отключиться и больше не срабатывать.
- Players.PlayerAdded — событие входа
- Соединение хранится в переменной, у него есть метод Disconnect
Показать решение
local Players = game:GetService("Players")local connectionconnection = Players.PlayerAdded:Connect(function(player)print(player.Name .. " зашёл")end)task.delay(10, function()connection:Disconnect()print("Подписка отключена")end)
Проверь себя
Что возвращает вызов Connect?
Показать ответ
Connect возвращает объект соединения с методом Disconnect.
Почему у Touched нужна защита от повторов?
Показать ответ
Персонаж касается детали несколькими частями тела и не один кадр подряд.