Метод :Once() — это способ подключиться к событию так, чтобы обработчик сработал только один раз, после чего автоматически отключится.
Это удобно, когда вам нужно выполнить действие единожды: запустить кат-сцену, выдать награду, среагировать на первое касание предмета и т.д.
Connection = Event:Once(Function)
После первого вызова события соединение отключается и больше никогда не запускается.
Когда использовать :Once()
Используйте :Once(), когда:
- событие должно срабатывать один раз за всю игру;
- важно избежать повторных вызовов, которые могут вызвать баги;
- нельзя допустить, чтобы игрок случайно активировал действие дважды;
- нужно предотвратить «двойные нажатия», «двойные покупки», «двойные телепорты»;
- вы не хотите вручную отключать соединение.
Сравнение :Connect() и :Once()
Примеры
1. Одноразовое касание объекта
local part = script.Parent
part.Touched:Once(function(hit)
print("Игрок коснулся объекта впервые!")
end)После первого касания код выполнится, и обработчик исчезнет.
2. Кат-сцена или вступительное сообщение
local Players = game:GetService("Players")
Players.PlayerAdded:Once(function(player)
print("Первый игрок зашёл в игру! Запускаем кат-сцену.")
end)Кат-сцена запустится только для самого первого игрока.
3. Одноразовая выдача награды
local proximityPrompt = script.Parent.ProximityPrompt
proximityPrompt.Triggered:Once(function(player)
player.leaderstats.Coins.Value += 100
print("Награда выдана!")
end)Игрок получит бонус только один раз, даже если снова активирует Prompt.
4. Одноразовый RemoteEvent
local event = game.ReplicatedStorage.StartMission
event.OnServerEvent:Once(function(player)
print(player.Name .. " начал миссию.")
end)Срабатывает при первом вызове RemoteEvent.
Типичные ошибки
❌ Ошибка 1. Ожидание повторного запуска
Once() не запускается дважды. Если вы планируете повтор — используйте :Connect().
❌ Ошибка 2. Попытка отключить соединение вручную
Соединение после срабатывания уже отключено.
❌ Ошибка 3. Размещение :Once() внутри циклов
Это может создавать много одноразовых обработчиков, что приводит к путанице.
Что происходит под капотом
- Создаётся временное соединение с событием.
- После первого вызова Roblox сам вызывает Disconnect() для него.
- Соединение невозможно повторно активировать.
Это делает :Once() самым безопасным способом создать одноразовый обработчик.
Заключение
Метод :Once() — отличный инструмент для создания одноразовых игровый событий в Роблокс Студио. Он помогает:
- избежать повторных вызовов;
- упрощает код;
- уменьшает количество активных соединений;
- делает поведение объекта более предсказуемым.
Используйте :Once() в ситуациях, где действие должно произойти строго один раз — это делает игру чище, стабильнее и профессиональнее.
