事件是你可以收听并回应的体验内事件。许多 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 对象。如果你将函数连接到事件,但下次发生事件时不想调用函数(例如满足某些条件后),请调用 Disconnect() 对 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.Partlocal touchedPart = part.Touched:Wait()print("The part was touched by", touchedPart:GetFullName())