事件

*此内容使用人工智能(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 对象。如果你将函数连接到事件,但下次发生事件时不想调用函数(例如满足某些条件后),请调用 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.Part
local touchedPart = part.Touched:Wait()
print("The part was touched by", touchedPart:GetFullName())

其他类型的事件

  • 可绑定的事件

    可绑定的事件让你在客户端-服务器边界的同一侧之间通信 之间 的脚本。

  • 远程事件

    远程事件可让你在客户端-服务器边界上通信