Collection Service 标签系统
什么是标签系统?
1.标签系统是一个用来管理一组带有标签的部件/组的服务。他让你更快的在每个带有标签的部件上实施脚本。
图中可见,每一根木头中都有一个脚本独立运行自己的代码,如果地图中有100个木头,只要有一个改变,我们就需要手动调整每一个脚本中的代码,不仅工作量大还吃力不讨好 。让我们一起学习标签系统并离开bug的恶梦吧 。
标签系统的脚本如何写?
为了更快上手,让我们一一举例实用的脚本吧
设置变量
在我们开始前,先设置一些变量以方便后面的实验
local CollectionService = game:GetService("CollectionService")
local white = game.Workspace.white
local black = game.Workspace.Black
white and black 对应的是左右的白与黑
1.添加标签
熟话说要训练你家的宠物,要先给他一个名字!
:AddTag(instance,string) – 物件/ 字符串(标签)
local CollectionService = game:GetService("CollectionService")
local white = game.Workspace.white
local black = game.Workspace.Black
CollectionService:AddTag(black,"Fire")
CollectionService:AddTag(white,"Fire")
我们使用:AddTag为两个部件都添加了"Fire"的标签,当部件不存在“Fire”标签,则会为其添加标签。
2.移除标签
:RemoveTag(Instance,String) -- 物件/ 字符串(标签)
以下为删除标签的方法
local CollectionService = game:GetService("CollectionService")
local white = game.Workspace.white
local black = game.Workspace.Black
CollectionService:RemoveTag(white,"Fire")
3.有标签
:HasTag(Instance,string) – 物件/ 字符串(标签)
接着,我们使用HasTag来确认白色部件有没有“Fire”的标签,测试后会返回布尔值的 True/false
local CollectionService = game:GetService("CollectionService")
local white = game.Workspace.white
if CollectionService:HasTag(white,"Fire") then
print("白色方块着火了")
else
print("白色方块并没着火")
end
print(CollectionService:HasTag(white,"Fire"))
因为之前我们把白色的火焰标签移除了,所以返回的值是
11:37:58.473 白色方块并没着火 - Server - Script:14
11:37:58.473 false - Server - Script:17
4.获取标签
:GetTags(instance) – 物件
:GetTags 让我们获取部件里所拥有的标签
local CollectionService = game:GetService("CollectionService")
local white = game.Workspace.white
local black = game.Workspace.Black
--在实验前,我们先为部件添加标签
CollectionService:AddTag(black,"Black")
CollectionService:AddTag(black,"wahaha")
CollectionService:AddTag(white,"OhYeah")
print(CollectionService:GetTags(white)) --打印白色的标签
print(CollectionService:GetTags(black))
输出:
white = {
[1] = "OhYeah
}
black = {
[1] = “Black”,
[2] = "hahaha
}
5.获取标签的物体
:GetTagged(“String”) --字符串(标签)
:GetTagged 让我们获取所有此标签的物体
local CollectionService = game:GetService("CollectionService")
local white = game.Workspace.white
local black = game.Workspace.Black
--在实验前,我们先为部件添加标签
CollectionService:AddTag(white,"Fire")
CollectionService:AddTag(black,"Fire")
print(CollectionService:GetTagged("Fire"))
输出:
{
[1] = Black,
[2] = White
}
现在我们为所有拥有“Fire”标签的部件添加,触碰后着火的脚本
local CollectionService = game:GetService("CollectionService")
local white = game.Workspace.white
local black = game.Workspace.Black
--在实验前,我们先为部件添加标签
CollectionService:AddTag(white,"Fire")
CollectionService:AddTag(black,"Fire")
for _, part in pairs(CollectionService:GetTagged("Fire"))do
part.Touched:Connect(function(otherPart) -- 让拥有Fire标签的部件与碰撞部件做链接
local character = otherPart:FindFirstAncestorOfClass("Model")
if character then
local fire = Instance.new("Fire") --创建新的火焰
fire.Heat = 15
fire.Size = 25
fire.Parent = part -- 父系为部件
end
end)
end
以上脚本为常用写法,对所有拥有标签的部件进行一次性任务。
Plugin插件
单独对每一个部件使用 :AddTag 就跟没使用过标签系统一样又麻烦又幸苦。接下来为你推荐一款由@SweetHeartichoke设计的插件 - Tag Editor - Roblox
下载完Tag-Editor后,会有两个界面
点击Tag Window,我们能看到里面有个标签的图案,点击里面的空格,输入名字,一个新的标签就做好了。
接着我们选择要加入标签的部件
在标签选项上就行了
最后我们就能在脚本上使用:GetTagged为其添加事件/函数
当我们想查看部件上的标签时,可以点击WorldView
把滑鼠拖到部件位置时,会展示部件所拥有的标签
结尾
最后的最后呢,我想说,标签系统特别适合用于跑酷,大亨或者其他需要大量重复性的东西,不仅把100个脚本变为一个,还能随时添加和删除标签。最后的资源里,我想分享两个自己制作的功能,一个是教程里的着火脚本,另一个是死亡脚本,脚本在game.ServiceScriptService里。
标签脚本.rbxl (34.5 KB)
资源引用
1.官方API (Collection Service)
https://developer.roblox.com/en-us/api-reference/class/CollectionService
2.国外论坛介绍 (Collection Service in a nutshell) (flamenco_687)
3.标签系统插件(Tag-Editor)
https://www.roblox.com/library/948084095/Tag-Editor
4.插件使用介绍