事件

*此內容是使用 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("Part was touched by", object:GetFullName())
end
-- 將功能連接到零件的已觸發事件
part.Touched:Connect(onPartTouched)

您也可以將 匿名函數 連接到事件,當您想使用父輩範圍中的變量且不需要在其他地方使用功能時。例如,這個代碼樣本避免了在 服務 中與類似樣本中的尷尬中介函數:


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 對物件。如果您將功能連接到事件,但下次發生事件時不想呼叫該功能(例如在滿足某些條件後),請在 對物件上呼叫 來解除連接。

以下代碼示例顯示如何從 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("The part hit the target!")
-- 斷開連線
connection:Disconnect()
end
end
-- 將上述功能連接到「已觸碰」事件
connection = part.Touched:Connect(onPartTouched)

如果您只想一次連接功能到事件,即只在事件首次發生時運行功能,請使用 Once() 方法作為連接和斷開功能的更便捷的替代方案。

等待事件發觸發

如果您想要一個腳本在特定事件發生之前持續輸出,請使用 Wait() 方法。這個方法返回事件的參數,您可以將它們分配給變量以供稍後使用:


local Workspace = game:GetService("Workspace")
local part = Workspace.Part
local touchedPart = part.Touched:Wait()
print("The part was touched by", touchedPart:GetFullName())

其他類型的事件

  • 可綁定事件

    可綁定事件讓您在客戶端服務器邊界的同一側之間通信 之間的腳本

  • 遠端事件

    遠端事件讓你能夠在客戶端與服務器邊界之間通訊》。