事件是您可以听到和响应的体验内的发生。许多 Roblox 服务和对象具有内置事件,这些事件会在响应特定操作或更改时自动 发生 。
例如,玩家触摸 Character 触摸 BasePart 会自动触发一个 Touched 事件。每次玩家加入您的体验时, 1> Class.Players.PlayerAdded1> 事件都会触发。
由于Roblox脚本的大量事件和客户端-服务器架构,脚本常常被称为 事件驱动 。 此方法与许多其他游戏引擎不同,它们强调在框架层次基础上运行代码。
您不需要听到事件或作出任何反应,但是事件正在发生,您可以使用它们。当您想要回应事件时,您将函数连接到它。
连接函数到事件
您使用 Connect() 将函数连接到事件,以便在事件发生时执行代码。大多数事件都会将参数传递给它们的连接函数。例如, BasePart.Touched 事件将触摸到的部体验 (例如
下面的代码示例显示了如何将名为 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)
从事件中关闭功能
Datatype.RBXScriptSignal.Connect()|Connect() 方法将一个 RBXScriptConnection 对象返回。如果您将一个函数连接到一个事件,但不想在下次事件触发时调用该函数(例如满足某些条件),请将其解除连接,通过在 Datatype.
下面的代码示例显示了如何连接和拆除函数从 Part.Touched 事件:
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 part = workspace.Partlocal touchedPart = part.Touched:Wait()print("The part was touched by", touchedPart:GetFullName())