Roblox Devs, stop misusing :WaitForChild()!
Вставка
- Опубліковано 9 лют 2025
- WaitForChild() is misused all the time, and I'm guilty of it too. Hopefully, this video will shed some light on when and when NOT to use WaitForChild()!
Have you ever wanted to learn Roblox Studio and Roblox Scripting? Check out my course: bit.ly/LuaScri...
Use code CODE_LUAU for 33% off!
My linktree:
linktr.ee/crus...
Have fun scripting!
Do you know someone who is horribly mistreating and abusing WaitForChild()?!?
Send em this video and let the WaitForChild abuse finally end!
i spam findfirstchild() way to much lmao even when it already exists sometimes
0:48 does anybody actually do that? i've never seen people on dev forum post anything like that
7:00 never seen anybody make that mistake
@@Czectly
"does anybody actually do that?"
Oh 100%, especially any beginners who don't really know about WaitForChild. When I first learned scripting, the tutorials I watched had people doing that lol
off topic but do you know what ConnectParallel() is any time i type function it has came up and their is like little to no info online about i tried messing around with and couldn't figure out what it did i have over 2 years of lua coding experience. every time i connect function it auto pops up and i want to know what it is badly even if it's useless engine feature @@crusherfire1
The habit is so built in, anytime I don’t see WaitForChild at the start of my scripts I always get the feeling that a laggy client will end up erroring everything, my palms get sweaty, knees weak, arms get heavy.
Mom’s spaghetti 🤑
@@SilliousBillious The next lyric was about Vomit on a sweater >:C
@@Raykiv ye ik it’s like there’s vomit on his sweater already I just said that cuz it’s a funny line lol
He's nervous, but on the surface he looks calm and ready, to write codes.
But he keeps on forgetting what he wrote down
The output goes so loud.
He opens his script but the codes won't come out.
He's burning out.
All the code is broken now.
The clock's run out.
Time is up, over blow!
@@thex2983 To find it's finality, get script locality
Breaking your habit, it's broke, WaitForChild() you spoke, just far too easily
No, he won't have it he knows
His whole back's to this code, it don't matter it's broke
He knows that but he's stoked, he's so stagnant
He knows, when he goes back to this broken code, that's when it's
Back to the pad again, yo this old game series
Better go capture this moment and hope it don't pass him...
waitforchild can sound really wrong if its not specified to be about programming 😭
"GetChildren" 😂😂
ClearAllChildren()
Instance.ChildRemoved:Wait()
@@ZylithDev That reminds me of how censored Roblox's method's name is. In GZDoom (Doom source port), there's a DECORATE function named “A_KillChildren”.
FindFirstChild
@@SpinnySpiwal let me see
your server replication explanation made multiplayer games very easy to understand
Steven Hawking definitely used Waitforchild()
💀
if age
Who tf is Steven hawking bro is he another developper
@@retrobloxy32 lmfao
@@retrobloxy32 are you for real
I know someone who has waitforchilditis. This video was very informative for helping me cure them
It's truly a terrible disease 😔
@@crusherfire1 I had waitforchilditis. Thank you for this cure!
@@TheDevelopmentHivei had waitforchilditis but i recovered before i watched this video
bro gave a better explanation of replication in a video about WaitForChild than most videos which entire purpose is explaining replication
I finally have a quick video to explain for me instead of explaining it myself and sounding like im yapping ❤️
@@Noober_0maybe dont yap then
everytime i script, i think about this: we don't wait for child, we find the childs
so that means we FindFirstChildWhichIsA(Dumbass)
childs 💀
@thistaken5550 😭 relax, its the other meaning
@@ItsHunderrwhat... no i mean its "children"
Astonishing video. I'm going to remove all "WaitForChild" from my scripts right now
Client-Sided Scripts:
"Part is not a valid member of Workspace"
thanks bro this is gonna cure my WaitForChilditis
3:07 fun fact on older versions of ROBLOX the client used to be able to replicate to the server but due to exploiters the client can now only replicate their avatar and nearby unanchored parts but nothing else
this was due to filtering disabled still existing allowing users to replicate the stuff from server to every client
WaitForChild() sounds exactly like something an adult roblox player would use and abuse in their life.....
FindFirstChild() sounds more like that
GetChildren() seems more accurate
this is why when you get to the end of an obby game and use those fly paths no one else can see it
Fun fact, fly paths have been in ROBLOX for over a decade. A lot of the tools were coded before server-client filtering was put in place. Back then, clients could do nearly whatever they wanted which was a huge security issue, including spawning bricks replicated to other players.
@@MatchaFlavoredTea woah that's really interesting, thanks for the fact
me when I lie
@@NewPuncher fr
i dont think thats how that works
now i gotta go back to all my scripts and fix this lol. Great video!
A great example of when you should use WaitForChild that you kind of missed is character loading.
That would fall into the category of instances created during runtime, so yes, use WaitForChild!
@@crusherfire1Well, for this, either WaitForChild() or Player.CharacterAdded:Wait() works.
@@XaneMyers
Yes, and also if you needed to access any descendants of the character, make sure to use WaitForChild!
@@crusherfire1 Player characters are tricky to reference and access, so I use my own module to store all of my character instance references. (I do use WaitForChild() while getting them, though.)
local character = player.Character or player.CharactedAdded:Wait()
Pretty sure you can do
Repeat wait() until game:isloaded(); as well instead of waitforchild
That would be unnecessary polling of a condition when you can listen to an event instead (game.Loaded)! Also, wait() is deprecated and task.wait() should be used for new work!
@@crusherfire1 Yeah, I forgot about task.wait(), you can use task event as well. But Repeat task.wait() until game:isloaded(), will still make the job done and it's minor computational resources even if it isn't the best practice it's still somewhat reliable.
@@crusherfire1 It was just an example, I know wait() is deprecated and not recommended to use. And the better thing to do is task.wait(), I am just lazy to type LOL
EXACTLY! I didn't use waitforchild unless it would break when I didn't use it because it wouldn't load, or when I needed to use it, I was always confused why people spam waitforchild like every line of code
wait why are you being confused over how someone else codes?
because waitforchild is not supposed to be used every time, only in certain instances, so i was confused why everyone just spammed it every line of code instead of writing code how its intended to be written and save time@@Im557
@@Im557 Confused over the unnecessary use of the :WaitForChild() function. And it isn't "how someone else codes", it's completely useless, and a waste of time to write.
@@FloxyCola this was 4 months ago
@@Im557 And I just found the video :)
Did you guys really spend 17 mins watching THIS?
yes
This helped alot! Also i'm sure :WaitForChild() can also be used in hetting the player's character as unlike many who use *_player.Character or player.CharacterAdded:Wait()_*
Some use *_Workspace:WaitForChild(player.Name)_* right?
Not the best option as there might be another object in the workspace with the same name as the player.
@@Secrethack_ that's why character added exists tho
You can also put players in folder (It requires character added too)
@@SaleMalesI don't think they were against characteradded tho
Hi just wanted to say thank you! Me and my friends are learning lua rn and this video will hopefully help us from making a bunch of mistakes!
This was the problem for me. It is hard to find in what order exactly these local and server sided stuff are loading in. Thank you for making this video
This is a well-made video, explaining extremelly well the use of :WaitForChild(). This was definitely worth the 17 minutes. This particularly helped me to fix an error on my script that i did not know how to fix.
Good job man, keep going!
Did not know this was how network ownership worked - thanks! 3:44
Unironically a banger explanation
I will go home and fix some parts of my script now
Also i genuinely learned much more about replication on this video than anything else lmao
This is one of many times where I'm actually ashamed of myself after watching a video 😅 I have been using waitforchild method in pretty much all of my variables in my local scripts, trying to access stuff that is already loaded in the client like you mentioned. I genuinely didnt like using waitforchild everytime whenever I want to access an instance but I felt it was necessary. After this video I'll definitely have to go on rehab and stop using waitforchild haha... Good video!
Your WaitForChilditis has been cured!
I like that at random moments you start to sound like squidward
Another topic I'd watch a video on would be when are things actually loaded into memory. For example, faraway part has a texture on it: is consuming memory? ReplicatedStorage part texture? Gui texture but .Visible = false. etc etc there are many cases where it's unclear what needs to be preloaded because it isn't loaded when you think it would be, or on the other hand cases where something is loaded that you wouldn't want to be and is just wasting memory.
A "Child" is basically a object. For those who think its weird to call a Function in a Programming Language like that. But what about "Parent" which is a Folder...
Roblox studio is basically the engine made for these who tired Unreal but got traumatized from the struggle to set up a simple dedicated server
probably
facts
0:47 Everytime i dont put waitforchilds in every line, my code works in studio but breaks in actual games
Don't know about server (Server don't need these)
But in client it is probably loading smh faster or have things pre-loaded
4:02 thats why hackers can manipulate unanchored objects in natural disaster, so if StickMasterLuke, do an loop on every part, and sets network ownership to nil, that problem will be fixed or isnt?
that random model of parts looks cool you should leave it in the description
You can make it yourself via the command line! Just create 500-1000 parts, color them randomly, size them randomly, and then position them randomly.
a ton of devs need to stop waiting for children, lets be real.
Here's an easier way to explain it.
Look at it as the Server and the client. The server has to send information to the client, our internet isn't godspeed, so it has to take time receiving this information. Which we call Ping. Milliseconds it took to receive the information.
Same for the Server. If you're on the client waiting for a part being created by the server by sending you packets of data, you want to use WaitForChild to wait for that part to exist.
Did he not basically say that in the video?
Even better is (probably, not absolutely sure, kind same thing you said)
Probably better cuz easier to understand sometimes
Server have already loaded in, the reason you need to use WaitForChild at server-side only if you sure that this thing won't exist (meaning it will not be there from start of game) when that code is launched
At client (player) you have to use WaitForChild since we don't have anything loaded in and have to load that in, and if this haven't loaded when some part of code is launched which using Instance, it will cause error, thats why you use WaitForChild
But ofc at client you can pre-load things like GUI's by putting them in ReplicatedStorage and using game:IsLoaded() and game.Loaded:Wait() (As I remember), and then for that gui you don't have to use WaitForChild at it anymore (Probably, I don't use this anyway)
Nice
1:46 a better way to illustrate this would be to show a computer instead of their face
ill keep on waiting for children.
7:00 This part is wrong. (edit: no im wrong, at some point they changed things) Quote from the PlayerGui page in the roblox documentation:
"When the player's Player.Character spawns for the first time all of the contents of StarterGui are automatically copied into the player's PlayerGui."
And since its cloned by the server, you need to make sure it's replicated. A workaround is to not use startergui at all and clone stuff to playergui through a local script
Nope. Please go ahead and test it yourself, I already have.
If you have a local script inside of the Gui in StarterGui, you do not need to wait for the replication of the descendants.
If you have a local script outside of StarterGui trying to grab the GUI, you only need to wait for the GUI itself to be cloned into the PlayerGui folder. However, you do not need to wait for the descendants.
I have dozens of local scripts for GUIs not even located in StarterGui and I only need to wait for the GUI itself, there is no need to use WaitForChild on any descendants of the GUI.
This is probably specialized behavior only for the StarterGui container.
@@crusherfire1 tried it, you're right. but this doesn't even make sense with what you're saying at 5:49, the gui is cloned by the server at runtime right? or is there just an exception for this cloning to work differently? i swear it wasn't always like this
@@_k.
Yes, the GUI is cloned by the server. You can prove that by listening to the ChildAdded event on both the client and server for the PlayerGui folder, and you will see it is added on the server first and then the client.
Now cloning is a synchronous operation, so it would make sense for all of the descendants to be made available (if cloning an object on local script to be accessed by another local script or server script to be accessed by another server script).
But with the StarterGui service, the behavior is a little more interesting since it being cloned by the server yet we don't need to wait for the descendants of the GUI. There must be some kind of special behavior going on behind the scenes that isn't well documented. However, I guess this would make sense because in the past you would actually have to use WaitForChild when accessing the PlayerGui folder since it was created by the server, but Roblox did something internally where you don't have to use WaitForChild.
Another developer did some tests and also confirmed that you don't need to use WaitForChild.
devforum.roblox.com/t/local-script-under-s%D1%81reengui-runs-only-after-all-gui-descendants-are-fully-replicated-to-playergui/2510092
@@crusherfire1 alright, thank you!
they really made waitforchild unnecessary for gui at some point between july and august without telling anyone...
6:59 STOP DONT USE WAITFORCHILD
Wait so this is why the game freaks out when, say, multiple people are sitting on a moving physics object?
My Dad had in his programing :WaitForChild(Never).
3:35 and most importantly permission to move your ROBLOX avatar
You can't stop me
They can't WaitForChild to grow up
How about for GUIs? Like if you place your GUI scrips inside somewhere else like StarterPlayerScripts
You would need to use WaitForChild on GUIs being cloned to the player's PlayerGui folder in scripts that are outside of that particular GUI.
Fortunately, however, you do not need to use WaitForChild on any of the GUIs descendants!
@@crusherfire1 So like, I just need to do a WaitForChild for each of the ScreenGUIs under PlayerGUI? Thank you, this video is incredibly helpful!
ogod I feel called out sm, please hab mercy for i have sin of WaitForChild misuse
grammar=trash
Broo I am learning extra stuff which I needed . I now know how to use waitforchild without knowing How to use it
the poblem of FindFirstChild is when the instance load after the script of FindFirstChild and it don't find it
are you using theme? how to make my roblox studio look like yours?
It's just modifications to some script editor settings in Studio. There is a plugin you can grab that has several presets available to choose from:
create.roblox.com/store/asset/3617323299/
@@crusherfire1 thank you
Missed opportunity to say "WaitFor Child Abuse"
I do admit that I have a WaitForChild() problem. I need to fix myself and recover some memory lol
i am yuri, i also wait for child outside playground so i can take them home.
🤨
Simple solution: just don't wait for the child
i never knew i had waitforchilditis, but after seeing this i got cured
we aint waiting for any child
lazy method: just never use waitforchild until it errors
I use ".", but if an object is added, I use waitforchild, or I use findfirstchild when eoblox messes up and guves me a random error when the object CLEARLY IS A MEMBER
Hey, i have a question. So i got a bit confused for the part about using WaitForChild for screen guis descendants (timestamp: 6:56) because even offical templates and other free resources made by roblox use WaitForChild to wait for ScreenGuis descendants which made me a bit confused. Are you completely certain that direct indexing like that for gui descendants is failproof and will never fail or is the people at roblox forgot that they don't need to do that?
"people at roblox forgot that they don't need to do that?"
A lot of Roblox scripts are outdated. Many still use the legacy wait(), spawn(), and delay() functions.
You can test it yourself, and as confirmed by another developer,
devforum.roblox.com/t/local-script-under-s%D1%81reengui-runs-only-after-all-gui-descendants-are-fully-replicated-to-playergui/2510092
you do not need to use WaitForChild() on GUI descendants that are copied over from the StarterPack.
I have dozens of GUIs in my projects and I don't ever use WaitForChild() for any of the descendants. I don't get any errors, ever.
@@crusherfire1 thanks for the clarification, i tested it and it works perfectly! although the new updated "Racing" template code which was released on the 23th of January (like 4 days ago) STILL uses waitforchild for descendants of the screen gui and they even put this comment above the code, this is the code snippet i am talking about:
-- RaceGui gets automatically cloned from StarterGui and may not be fully replicated when this script runs.
-- Use WaitForChild to wait for the necessary instances to replicate.
local raceGui = playerGui:WaitForChild("RaceGui")
local uiScale = raceGui:WaitForChild("UIScale")
local countdownLabel = raceGui:WaitForChild("CountdownLabel")
local finishFrame = raceGui:WaitForChild("FinishFrame")
this is very recent so i guess they did forget they don't need to do this...
For adhd people:
- No need to use on server except if we are waiting for child inside of cloned instance
- No need to use it on ReplicatedStorage/Lighting instances unless the code is run from ReplicatedFirst
we need more people like you
i won't wait for child
It looks ugly if you use them unnecessarily
I feel lucky that ive never felt the need to daisy-chain waitforchilds.
as a man who likes waiting for children and the touched event, I found this video extremely helpful.
me too
Excuse me
I’m gonna guess before I even watch this is that WaitForChild shouldn’t be chained.
12:41 with the recent audio api update I’ve ram into issues wiring stuff since the script is running before everything loads, if I use a waitforchild on for example a parent of an object but that object has children it’ll still give me an error since the child didn’t load yet, I’m confused as to how yours isn’t the same since you mentioned the script only runs after everything loads?
Are your instances in the workspace? If you have streaming enabled + items in the workspace, you'll have to use WaitForChild, otherwise, you won't need to if streaming is disabled.
dads spam that in their code 😂😂😂
Bro am I just the only one using the dot operator💀
when scripters need to wait for a child comes out from school:
I only used it when that object can exist only one and never be deleted, mostly at the top of the script when I need a reference of something.
Why
the wait for child chain
why was there a delay in movement of the player in the server
Very informative, thank you.
thanks i have never not used wait for child ever and now i might not use it as much maybe
Video:WaitForChild("Tomato"):WaitForChild("Comment"):WaitForChild("TextLabel")
Amazing Tutorials Thx For The Help
to be honest the only time i acctually used it was when a item you had to pick up would just kill the user getting it so i just made a script for the player that waits for the child to hold it then enabled its scripts
Me who uses the WaitForKing() variable instead as it is more powerful:
Learned a lot from this video,
and none of it had to do with WaitForChild() 😂
But no really lots of small stuff I didn’t know about. Good video. 👍
literal child abuse...
great video, but im going to continue misusing it
🤨
oh also devs stop missusing GetService most of the time it's useless
worst take i have seen this week
stop calling me out bro i literally have 15k instances of code in my skill handler that use wait for child, i don’t think i can change it man
in local scripts, i add this to the first line: (especially if it's replicated first, if not i just use it in scripts that runs right after replicatedfirst)
if not game:IsLoaded() then game.Loaded:Wait() end
it helps me alot and sometimes i don't even need to use :WaitForChild() at all
Let me just whip out my notebook
why did this show up in my recommended thing?????
Thank you! That was helpful
Yeah I've seen byteblox doing that. It completely irritated me.
lol
Guys, let's WaitForChild() !! (take it in a different context)
Don't use wait() use the task library instead which has task.wait()
Of course. The code that had the wait() in it was written before the task library was released.
apparently it ruins something, i think performance? but thats what ive heard on devforum + im not a scripter@@wwa-du7jw
@@wwa-du7jw wait has weird delays if u have low fps i think but im not sure
can you make a video about your script editor? whats the font ur using?
indeed, go get the milk instead.
Hey, I have the exact opposite problem where I don’t use it at all…
Do you have a video that cures that?
im sad that this is all basic knowledge to me but i still suck at scripting
are you going to continue doing things like this? cuz u got a new sub fr
How did you do the split screen with both Client and server view. I usally switch between them (when im working on client scripts) which is kinda annoying
But... consistency!!!
So do we even need to use it at all, ignoring streamingenabled?
Time to rewrite 90% of my large scale game's code 😭
You only need to use it for instances created during runtime. If you do not have streaming enabled, then you don't even need to use WaitForChild on the static instances in the workspace. (Static meaning instances downloaded from the snapshot when a player joins the game).
Any dynamic instances (instances created or destroyed during runtime) should be handled with more care.
what about getService? why don't we just index things from game?
i cant believe all these months ive been doing it wrong
but whats the problem even if you use waitforchild, i dont think there any implications to use it right
Well first off, chaining a whole bunch of WaitForChild function calls takes much longer to type than directly indexing.
Secondly, it makes your code harder to read.
Thirdly, WaitForChild shouldn't be used when you don't need to wait for a child, it's a gross misuse of the function.
If you want to save time typing (which is a big deal when programming) and you know you don't need to use WaitForChild, then don't use it lol
so it doesnt affect performance? @@crusherfire1