I'd like to know what the difference is, and when I should use which one.
Difference | parent:WaitForChild(name) |
parent:FindFirstChild(name) |
parent[name] |
---|---|---|---|
Timing | waits as long as needed | instant | instant |
When not found | waits as long as needed | returns nil |
errors |
If you know a child exists, you should not use either :WaitForChild
or :FindFirstChild
, you should use parent[name]
, e.g.,
Example: .
and []
local obj = workspace["Brick"] -- or equivalently local obj = workspace.Brick
Only do this when you know the object exists. If the object does not exist, your script will error and stop running.
If you are certain that the object will exist after a short time (e.g., someone else is in the process of making it for you -- the character is spawning and you are waiting for their Head, or you are waiting for a PlayerAdded script to add the "leaderstats" object to the player)
then you should use :WaitForChild
. It cannot return nil
and it cannot error. It will return the object as soon as it exists. Caveat: If an exist object is renamed to the name you asked for, then it will not realize it exists.
In particular, that means you can't use Instance.new("Part", parent)
because it will be added with the name "Part"
rather than the name you are waiting for.
Example: :WaitForChild
local player = game.Players.LocalPlayer -- (there is another script that adds leaderstats to new players) local leaderstats = player:WaitForChild("leaderstats")
Maybe you're giving the player something, but you are making sure they don't already have one. In this case, you don't want to wait until they have it, because it's your job to give it to them.
We can check it if exists using :FindFirstChild
. (You cannot do this with :WaitForChild
because :WaitForChild
never returns nil
-- it just waits)
if player.Backpack:FindFirstChild("Sword") ~= nil then print("You already have a sword!") else sword:Clone().Parent = player.Backpack print("You get a new sword") end
For the same reason as above, if you have no expectation that any other script will add the object, then you should not wait for that to happen.
-- start burning if anything burning touches me if hit:FindFirstChild("Fire") then Instance.new("Fire", script.Parent) end