事件是游戏中可以监听和响应的发生情况。许多 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)
您还可以将 匿名函数 连接到事件,当您希望使用父作用域中的变量并且不需要在其他地方使用该函数时。例如,这段代码避免了与 服务 中类似示例的笨拙中介函数:
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.Partlocal touchedPart = part.Touched:Wait()print("该部件被", touchedPart:GetFullName(), "触碰了")