CollectionService 管理标签 对象 的群组(标签). 标签是从服务器到客户端复制的对象的应用集。它们还会在地方保存时串化。
Class.CollectionService 的主要用途是注册实例并使用特定标签来扩展其行为。如果您发现自己在添加同一个脚本到许多不同的对象,那么使用 CollectionService 的脚本可能会更好。
标签可以通过这个类的方法添加或移除标签,例如 AddTag() 或 RemoveTag()。它们还可以通过 Studio 中的标签部分的属性管理直接在 Studio 中管理,或通过内置的1>标签编辑器1>工具来管理。
复制
当标签复制时, 所有标签在对象上同时复制 。因此,如果您在客户端设置标签,那么在服务器上的不同标签上添加/移
概要
方法
将标签应用到 Instance 。
返回一个标记添加到对象时触发的信号。
返回一个标记被从实例中移除时触发的信号。
返回游戏中带有指定标签的对象阵列。
获取对指定对象应用的所有标签的阵列。
检查对象是否拥有指定标签。
从实例中移除标签。
活动
当标签被添加到对象时,添加的标签是该标签在该场景的唯一的出现。
当标签从对象中移除时,标签已不再使用,这会导致火焰。
属性
方法
AddTag
添加标签将标签应用到一个 Instance ,不会在标签已应用到实例时执行任何操作。 成功添加标签会触发由 CollectionService:GetInstanceAddedSignal() 创建的信号,并使用指定的标签进行标记。
警告: 标记实例时,常常有一些资源被用来为标记提供其功能,例如事件连接或表。为了防止内存泄露,一旦不再需要标记,就要清理这些 (连接到信号的返回,设置为零等)
参数
返回
GetInstanceAddedSignal
给予GetInstanceAdded一个字符串签(string),并返回一个信号,它在两个条件下触发:
- 有了标签的实例将作为DataModel的子裔添加,例如通过设置Instance.Parent或类似。
使用相同标签的后续调用此方法将返回同一的信号对象。请考虑使用 CollectionService:GetTagged() 来获取已有标签的对象列表(从而不会触发事件),以及 DataModel 中的 “Class.Col
还请参阅 CollectionService:GetInstanceRemovedSignal(),这会在类似条件下触发的事件返回。
参数
您要关注的标签。
返回
当您将标签添加到实例时触发的事件。
代码示例
local CollectionService = game:GetService("CollectionService")
local tag = "Deadly"
local function onDeadlyPartTouched(otherPart)
if not otherPart.Parent then
return
end
local human = otherPart.Parent:FindFirstChildOfClass("Humanoid")
if human then
human.Health = 0
end
end
-- Save the connections so they can be disconnected when the tag is removed
-- This table maps BaseParts with the tag to their Touched connections
local connections = {}
local function onInstanceAdded(object)
-- Remember that any tag can be applied to any object, so there's no
-- guarantee that the object with this tag is a BasePart.
if object:IsA("BasePart") then
connections[object] = object.Touched:Connect(onDeadlyPartTouched)
end
end
local function onInstanceRemoved(object)
-- If we made a connection on this object, disconnect it (prevent memory leaks)
if connections[object] then
connections[object]:Disconnect()
connections[object] = nil
end
end
-- Listen for this tag being applied to objects
CollectionService:GetInstanceAddedSignal(tag):Connect(onInstanceAdded)
CollectionService:GetInstanceRemovedSignal(tag):Connect(onInstanceRemoved)
-- Also detect any objects that already have the tag
for _, object in pairs(CollectionService:GetTagged(tag)) do
onInstanceAdded(object)
end
GetInstanceRemovedSignal
GetInstanceRemoved 将被标记 (一个字符串) 和返回一个信号,该信号在两个条件下触发:
- 带有指定标签的实例将作为DataModel的子裔被移除,例如通过Instance.Parent或类似的方式取消设置。
使用相同标签的后续调用将返回相同的信号对象。信号有助于清理使用过的资源,例如关闭连接。
还请参阅 CollectionService:GetInstanceAddedSignal(),这会在类似条件下触发的事件返回。
参数
您要关注的标签。
返回
当您从实例中移除标签时触发的事件。
代码示例
local CollectionService = game:GetService("CollectionService")
local tag = "Deadly"
local function onDeadlyPartTouched(otherPart)
if not otherPart.Parent then
return
end
local human = otherPart.Parent:FindFirstChildOfClass("Humanoid")
if human then
human.Health = 0
end
end
-- Save the connections so they can be disconnected when the tag is removed
-- This table maps BaseParts with the tag to their Touched connections
local connections = {}
local function onInstanceAdded(object)
-- Remember that any tag can be applied to any object, so there's no
-- guarantee that the object with this tag is a BasePart.
if object:IsA("BasePart") then
connections[object] = object.Touched:Connect(onDeadlyPartTouched)
end
end
local function onInstanceRemoved(object)
-- If we made a connection on this object, disconnect it (prevent memory leaks)
if connections[object] then
connections[object]:Disconnect()
connections[object] = nil
end
end
-- Listen for this tag being applied to objects
CollectionService:GetInstanceAddedSignal(tag):Connect(onInstanceAdded)
CollectionService:GetInstanceRemovedSignal(tag):Connect(onInstanceRemoved)
-- Also detect any objects that already have the tag
for _, object in pairs(CollectionService:GetTagged(tag)) do
onInstanceAdded(object)
end
GetTagged
GetTagged 返回一个带有指定标签的对象阵列,其子是 DataModel 的后代 ( game )。 此标签通过使用 CollectionService:AddTag() 来添加,将确保此方法不
如果您想要检测所有带有标签的对象,现有和未来的,使用此方法来在对象上循环过程中也作为一个连接到CollectionService.GetInstanceAddedSignal返回的信号。
此方法不保证返回的对象的任何订购。 此外,可能对象有与给予标签,但不是DataModel 的后代,即其父为零。 此方法不会返回此类对象。
参数
搜索标签。
返回
一个包含所有标签的实例列表。
代码示例
local CollectionService = game:GetService("CollectionService")
local tag = "Deadly"
local function onDeadlyPartTouched(otherPart)
if not otherPart.Parent then
return
end
local human = otherPart.Parent:FindFirstChildOfClass("Humanoid")
if human then
human.Health = 0
end
end
-- Save the connections so they can be disconnected when the tag is removed
-- This table maps BaseParts with the tag to their Touched connections
local connections = {}
local function onInstanceAdded(object)
-- Remember that any tag can be applied to any object, so there's no
-- guarantee that the object with this tag is a BasePart.
if object:IsA("BasePart") then
connections[object] = object.Touched:Connect(onDeadlyPartTouched)
end
end
local function onInstanceRemoved(object)
-- If we made a connection on this object, disconnect it (prevent memory leaks)
if connections[object] then
connections[object]:Disconnect()
connections[object] = nil
end
end
-- Listen for this tag being applied to objects
CollectionService:GetInstanceAddedSignal(tag):Connect(onInstanceAdded)
CollectionService:GetInstanceRemovedSignal(tag):Connect(onInstanceRemoved)
-- Also detect any objects that already have the tag
for _, object in pairs(CollectionService:GetTagged(tag)) do
onInstanceAdded(object)
end
GetTags
GetTags 将给予一个实例,并返回一个阵列的字符串,这些字符串是应用于指定对象的标签。
local CollectionService = game:GetService("CollectionService")local object = workspace.Modellocal tags = CollectionService:GetTags(object)print("The object " .. object:GetFullName() .. " has tags: " .. table.concat(tags, ", "))
此方法有助于您想要在多个标签上同时执行某些对象作时。 但是,使用此方法来检查单个标签的存在是不合理的。 使用 CollectionService:HasTag() 来检查单个标签。
参数
返回标签的对象。
返回
用于指定对象的字符串阵列。
代码示例
local CollectionService = game:GetService("CollectionService")
local object = script.Parent.Part
-- Add a tag
CollectionService:AddTag(object, "Deadly")
-- Query for a tag
if CollectionService:HasTag(object, "Deadly") then
print(object:GetFullName() .. " is deadly")
end
-- List tags on an object
local tags = CollectionService:GetTags(object)
print("The object " .. object:GetFullName() .. " has tags: " .. table.concat(tags, ", "))
-- Remove a tag
CollectionService:RemoveTag(object, "Deadly")
HasTag
有标签返回给定对象是否有标签。
- 使用 CollectionService:AddTag() 来添加标签会导致此方法返回 true。
- 使用 CollectionService:RemoveTag() 来移除标签会导致此方法返回 false。
通过扩展,使用 CollectionService:GetTags() 在对象上返回的任何标签都会在使用此方法时返回真。
参数
返回
是否拥有标签。
代码示例
local CollectionService = game:GetService("CollectionService")
local object = script.Parent.Part
-- Add a tag
CollectionService:AddTag(object, "Deadly")
-- Query for a tag
if CollectionService:HasTag(object, "Deadly") then
print(object:GetFullName() .. " is deadly")
end
-- List tags on an object
local tags = CollectionService:GetTags(object)
print("The object " .. object:GetFullName() .. " has tags: " .. table.concat(tags, ", "))
-- Remove a tag
CollectionService:RemoveTag(object, "Deadly")
RemoveTag
移除标签将从实例中移除标签。 此方法不会发生错误,如果对象在第一场景没有标签。 成功移除标签将触发由 CollectionService:GetInstanceRemovedSignal() 创建的信号,并使用指定的标签发射成功。
当移除标签时,有些资源常常用于为标签提供其功能,例如事件连接或表。为了防止内存泄露,请在不再需要标签时清理这些(取消连接、设置为零等)。
参数
返回
代码示例
local CollectionService = game:GetService("CollectionService")
local object = script.Parent.Part
-- Add a tag
CollectionService:AddTag(object, "Deadly")
-- Query for a tag
if CollectionService:HasTag(object, "Deadly") then
print(object:GetFullName() .. " is deadly")
end
-- List tags on an object
local tags = CollectionService:GetTags(object)
print("The object " .. object:GetFullName() .. " has tags: " .. table.concat(tags, ", "))
-- Remove a tag
CollectionService:RemoveTag(object, "Deadly")