事件

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

事件是您可以偵聽和回應的遊戲內發生的事件。許多 Roblox 服務和物件都有內建事件,這些事件會自動根據特定動作或變化而 觸發

例如,玩家的 Character 觸碰到 BasePart 時,會自動觸發 Touched 事件。每當玩家加入您的遊戲時,Players.PlayerAdded 事件會觸發。

由於事件數量龐大以及客戶端-伺服器架構的關係,Roblox 腳本通常被稱為 事件驅動。這種方法與許多其他遊戲引擎強調逐幀執行代碼的方式不同。

您不必偵聽事件或對其採取任何行動,但這些事件仍然會觸發並可用。當您想要回應某個事件時,您可以將一個函數連接到該事件。

將函數連接到事件

您可以使用 Connect() 將函數連接到事件,以在每次事件觸發時執行代碼。大多數事件會將參數傳遞給其連接的函數。例如,BasePart.Touched 事件會傳遞觸碰到該部件的物件(例如,左手或汽車輪胎),而 Players.PlayerAdded 事件則會傳遞加入您遊戲的 Player

以下代碼示例顯示如何將名為 onPartTouched() 的函數連接到部件的 Touched 事件:


-- 假設腳本是附加到部件上
local part = script.Parent
-- 您想要運行的函數
local function onPartTouched(object)
print("部件被", object:GetFullName(), "觸碰了。")
end
-- 將函數連接到部件的 Touched 事件
part.Touched:Connect(onPartTouched)

您還可以將 匿名函數 連接到事件,當您想在父範圍中使用變數且不需要在其他地方使用該函數時。以下代碼示例避免了在 Services 中類似示例的尷尬中介函數:


local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SaveManager = require(ReplicatedStorage:WaitForChild("SaveManager"))
local function saveProgress(character)
local position = character:FindFirstChild("HumanoidRootPart").Position
SaveManager.saveData(character, position)
end
-- 匿名函數,當角色從遊戲中移除時調用 saveProgress()
-- 在這種情況下,是當玩家離開時。
Players.PlayerAdded:Connect(function(player)
player.CharacterRemoving:Connect(saveProgress)
end)

斷開函數與事件的連接

Connect() 方法會返回一個 RBXScriptConnection 物件。如果您將函數連接到一個事件,但不想在事件下次觸發時調用該函數(例如,在某些條件滿足後),您可以通過在 RBXScriptConnection 物件上調用 Disconnect() 來斷開它。

以下代碼示例顯示如何從 Part.Touched 事件連接和斷開函數:


local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local targetPart = Workspace.TargetPart
-- 宣告一個空的佔位變數來儲存連接
local connection
local function onPartTouched(otherPart)
if otherPart == targetPart then
print("部件撞擊了目標!")
-- 斷開連接
connection:Disconnect()
end
end
-- 將上面的函數連接到 Touched 事件
connection = part.Touched:Connect(onPartTouched)

等待事件觸發

如果您希望一個腳本在特定事件觸發之前暫停,請使用 Wait() 方法。此方法返回事件的參數,您可以將其賦值給變數以便後續使用:


local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local touchedPart = part.Touched:Wait()
print("該部件被", touchedPart:GetFullName(), "觸碰了。")

其他類型的事件

©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。