Collection Service 标签系统

Collection Service 标签系统

什么是标签系统?:label:
1.标签系统是一个用来管理一组带有标签的部件/组的服务。他让你更快的在每个带有标签的部件上实施脚本。


图中可见,每一根木头中都有一个脚本独立运行自己的代码,如果地图中有100个木头,只要有一个改变,我们就需要手动调整每一个脚本中的代码,不仅工作量大还吃力不讨好 :sneezing_face:。让我们一起学习标签系统并离开bug的恶梦吧 :smiling_imp:

标签系统的脚本如何写?
为了更快上手,让我们一一举例实用的脚本吧

设置变量
在我们开始前,先设置一些变量以方便后面的实验

local CollectionService = game:GetService("CollectionService")

local white = game.Workspace.white
local black = game.Workspace.Black

white and black 对应的是左右的白与黑

1.添加标签
熟话说要训练你家的宠物,要先给他一个名字:label:

: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后,会有两个界面
Screenshot 0004-04-19 at 4.37.34 PM
点击Tag Window,我们能看到里面有个标签的图案,点击里面的空格,输入名字,一个新的标签就做好了。


接着我们选择要加入标签的部件
Screenshot 0004-04-19 at 4.40.36 PM
在标签选项上:ballot_box_with_check:就行了

最后我们就能在脚本上使用:GetTagged为其添加事件/函数

当我们想查看部件上的标签时,可以点击WorldView
Screenshot 0004-04-19 at 4.42.46 PM
把滑鼠拖到部件位置时,会展示部件所拥有的标签
Screenshot 0004-04-19 at 4.42.51 PM

结尾
最后的最后呢,我想说,标签系统特别适合用于跑酷,大亨或者其他需要大量重复性的东西,不仅把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.插件使用介绍

2 个赞

i love collectionservice

1 个赞

Thank you, CollectionService is really useful ^^

关于我们    加入我们    条款    隐私政策
©2021 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。
粤ICP备20013629号