Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

How do I correctly connect a script to Tagged Objects in CollectionService?

Asked by 3 years ago

I was trying to test Tags and Collection Service. I have set-up the Tag using the Instance Tagging, and then added a block (say, Block1) to the tag.

On ServerScriptService, I have created a script with the following code:

local CollectionService = game:GetService("CollectionService")
local CollectionName = "PoppingBlocks" --The name of the Tag

local function onTouch()
     print("Touched object")
end

for _, object in pairs(CollectionService:GetTagged(CollectionName)) do  
    object.Touched:Connect(onTouch)
end

Expected: When I touch the object, console must print "Touched object"

Touching the object does not do anything. Furthermore, how do I pass more parameters on Touched event?

local CollectionService = game:GetService("CollectionService")
local CollectionName = "PoppingBlocks" --The name of the Tag

local function onTouch(object)
     print("Touched object " .. object.Name)
end

for _, object in pairs(CollectionService:GetTagged(CollectionName)) do

    object.Touched:Connect(onTouch(object)) --???
end

???: Doesn't the Touch event send 'hit' or 'otherpart' as a parameter? What would the 'object' parameter in the Connect() function be?

Also, how do I destroy the block? My original method was applying this script to the block manually, and then calling script.Parent

local this = script.Parent

local function onTouch()
     print("Touched object" .. this.Name .. ")
     this:Destroy()
end

this.Touched:Connect(onTouch)

This method simply worked. However, for obvious reasons, it was very tedious. I found myself editing one script, and copy-pasting it to every block I need.

1 answer

Log in to vote
0
Answered by
DollorLua 235 Moderation Voter
3 years ago

Im gonna try to answer this the best I can

(after the "Expected: When I touch the object, console must print "Touched object"" part) 1st question: object.Touched should work.

If you want to use premade parameters you could do something like this (this should also answer your second question in the comments):

-- code goes inside of the for loop

object.Touched:Connect(function(hit)
    -- you have access to both "hit" and "object" in here

    print(object:GetFullName() .." Touched ".. hit:GetFullName()) -- getfullname so you can get the path of the object
    object:Destroy() -- same thing as your request of this:Destroy()
end)
0
Your assurance of "should worked" helped me a lot and forced me to try every other possible solution. I just had to call the loop again to update new objects in |CollectionService:GetTagged(CollectionName)|. Thank you! ConsteIeo 63 — 3y
Ad

Answer this question