As you can see by the title above of the topic, I would like to understand what is the difference between the functions WaitForChild and FindFirstChild, as both from my perspective seems to be a bit complicated to comprehend and analyze where I can apply into Scripts/LocalScripts…
To note as well, I tried looking throughout the API Reference, yet it is not comprehensive enough. If anyone can help me, that would be very appreciative!
WaitForChild is just to wait until there is a child available to that name
FindFirstChild is to find the first child to that name, since you can sometimes have multiple children with the same name FindFirstChild will get the first children
You can use either in local or server scripts, I recommend to use WaitForChild since it halts the script until it finds the child
I would agree with what @dutycall11 said. WaitForChild() is especially helpful when working with things that don’t start in the workspace, for example the player. And FindFirstChild() sometimes has to do with things already in the workspace but FindFirstChild really specifies the name of an object
So, let me make an example, if a player spawns in-game, and I would like to find his Player.Humanoid, I will have to use WaitForChild:
local RBLX_Players = game.GetService(“Players”)
RBLX_Players.PlayerAdded:Connect(function(player)
local found = WaitForChild(“Humanoid”)
if found == Humanoid then
print(“Humanoid found”)
else
print(“Something is not right!”)
end
end)
local RBLX_Players = game.GetService(“Players”)
RBLX_Players.CharacterAdded:Connect(function(player)
local found = WaitForChild(“Humanoid”)
if found == Humanoid then
print(“Humanoid found”)
else
print(“Something is not right!”)
end
end)
I rewrite the little example, so, it should be correct, right?
Somewhat correct, what you should be doing is connect a function to playerAdded to detect when a player joins, then using the player argument, you should be able to detect when the the player’s character is made using characterAdded
Note that there is no need to use :WaitForChild() because all of the child components are already rendered in the server. Plus characterAdded will fire everytime the character is created/recreated
local RBLX_Players = game:GetService(“Players”)
RBX_Players.PlayerAdded:Connect(function(player)
player.CharacterAdded:Connect(function(character)
if character:FindFirstChild("Humanoid") then
print("Humanoid")
else
print("None")
end
end)
end)
This would not work because WaitForChild has to be a part of some parent, here is your code but fixed:
local RBLX_Players = game:GetService("Players")
RBLX_Players.PlayerAdded:Connect(function(player)
player.CharacterAdded:Connect(function(character)
local found = character:WaitForChild("Humanoid")
if found then
print(.. player.Name .. "'s humanoid was found")
else
print("Something is wrong")
end
end)
end)
Let’s say you have a part that only loads into the game after a certain amount of time. If I want to reference this in a different script, I can use either of these methods to get the object.
The difference between the two is that FindFirstChild() will immediately return nil if it does not see the object, whereas WaitForChild() will wait a certain amount of time (specified by the second parameter) before returning nil, as well as pausing the script until it finds said object. In the situation where the part may or may not have loaded in yet, using the second option is preferred as the first option could cause a random chance of your script breaking.