Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

How to Get All Children and Change Them?

Okay, So I made a script that when one block is hit by a part called 'Rocket' it changes the child (removes it or changes material)

It works with one or two chains (children) but when I have many of them it's hard to list them out in a script and it gets complicated.

How can I make it so it gets the children and then changes them as a whole?

:GetChildren() only gives a read-only output, so how can I accomplish this?

Script that works with two chains:

local buttonPressed = false

Hits = script.Parent.Hits
Chain1 = script.Parent.Parent.Chain1
Chain2 = script.Parent.Parent.Chain2

function checkhits()
	Hits = Hits
end
	

script.Parent.Touched:connect(function(bang)
	if not buttonPressed then
        buttonPressed = true
	if bang.Name == "Rocket" then
		Hits.Value = Hits.Value + 1
		wait(1)
		buttonPressed = false
	end
	end
end)



 
	
		while true do
		wait(0.1)
		checkhits()
		if Hits.Value == 1 then
			Chain1.Material = "Marble"
			Chain2.Material = "Marble"
		elseif Hits.Value == 2 then
			script.Parent:Destroy()
			Chain1.Material = "CorrodedMetal"
			Chain2.Material = "CorrodedMetal"
			Chain1.Anchored = false
			Chain2.Anchored = false
		end
		end

2 answers

If you want to get all children, you would use the GetChildren method like you said.

GetChildren is a method that returns a table containing all of the children of the object it is used on. For example, workspace:GetChildren() would return a table full of all of the children of workspace.

We can use this to our advantage if we want to do something to all of the children of an object by iterating through the table. Since the table is in list form, that means that all indices are numerical, and that allows us to use a simple for loop with an increment variable or we can use a key-value pair iterator function like pairs or next.

Now, we can get a reference to each child of the table and do something to it.

For loop with increment variable

local children = workspace:GetChildren()
for index = 1, #children do
	local child = children[index]
	-- do whatever you want to this child
end

For loop with iterator function next

for _, child in next, workspace:GetChildren() do
	-- do whatever you want to this child
end

For loop with iterator function pairs

for _, child in pairs(workspace:GetChildren()) do
	-- do whatever you want to this child
end

If I wanted to print all of the children of workspace with next, I would write the following

for _, child in next, workspace:GetChildren() do
	print(child)
end

Building off of Sukinahito's answer, you might want to build a function to apply the property to all children automatically:

function ApplyProperty(property, value)
	local ch = script.Parent:GetChildren()
	for i = 1, #ch do
		pcall(function() ch[i][property] = value end)
	end
end
--Usage:
ApplyProperty("Anchored", true)

I use pcall incase the child doesn't have the property. Without pcall, you could get an error when you try to run it if one of the children doesn't have the property.

This discussion is preserved as it was. New answers, comments, and votes are closed.