Roblox Devs, stop misusing :WaitForChild()!
HTML-код
- Опубликовано: 29 авг 2024
- 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 LUA_CODING 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
Steven Hawking definitely used Waitforchild()
💀
if age
Who tf is Steven hawking bro is he another developper
@@retrobloxia301 lmfao
@@retrobloxia301 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 ❤️
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
your server replication explanation made multiplayer games very easy to understand
before 2018 it used to be that all clients can replicate to the server, but then Roblox introduced FilteringEnabled, which makes it the way you're explaining it.
exploiters when 2018: noooooooooooo i can not do the hack anymore waaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
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
Astonishing video. I'm going to remove all "WaitForChild" from my scripts right now
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!
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
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 :)
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!
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()
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!
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
WaitForChild() sounds exactly like something an adult roblox player would use and abuse in their life.....
thanks bro this is gonna cure my WaitForChilditis
everytime i script, i think about this: we don't wait for child, we find the childs
so that means we FindFirstChildWhichIsA(Dumbass)
I like that at random moments you start to sound like squidward
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
1:46 a better way to illustrate this would be to show a computer instead of their face
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.
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
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
3:35 and most importantly permission to move your ROBLOX avatar
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
My Dad had in his programing :WaitForChild(Never).
dads spam that in their code 😂😂😂
6:59 STOP DONT USE WAITFORCHILD
the poblem of FindFirstChild is when the instance load after the script of FindFirstChild and it don't find it
You can't stop me
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.
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
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
ogod I feel called out sm, please hab mercy for i have sin of WaitForChild misuse
They can't WaitForChild to grow up
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.
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
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...
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...
oh also devs stop missusing GetService most of the time it's useless
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. 👍
Video:WaitForChild("Tomato"):WaitForChild("Comment"):WaitForChild("TextLabel")
I’m gonna guess before I even watch this is that WaitForChild shouldn’t be chained.
It looks ugly if you use them unnecessarily
Wait so this is why the game freaks out when, say, multiple people are sitting on a moving physics object?
we aint waiting for any child
Mom:Goes to shopping mall with child
Child:Sees Hot Wheels on Toys"R"Us and getting buzy on it
Mom:waitforchild()
lazy method: just never use waitforchild until it errors
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!
Why
thanks i have never not used wait for child ever and now i might not use it as much maybe
Missed opportunity to say "WaitFor Child Abuse"
Did you guys really spend 17 mins watching THIS?
yes
Thanks for the invitation!!!
local MUAHAHA = game:WaitForChild("ReplicatedStorage"):WaitForChild("Folder"):WaitForChild("Folder"):WaitForChild("Folder"):WaitForChild("Folder"):WaitForChild("Folder"):WaitForChild("Folder"):WaitForChild("Folder"):WaitForChild("Folder")
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.
@@wwa-du7jw it's slower and less accurate. just ran this in the studio console after hitting play on one of my test places:
12:41:13.622 > print(wait()) - Studio
12:41:13.666 0.04290370000000365 47.31120865861885 - Client
12:41:23.371 > print(task.wait()) - Studio
12:41:23.381 0.009695800000002919 - Client
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
Yeah I've seen byteblox doing that. It completely irritated me.
lol
I am just curious, where do you get all of this knowledge?
This is actually really helpfull thx brotha. Hope you can make more videos like this
as a man who likes waiting for children and the touched event, I found this video extremely helpful.
me too
Excuse me
Thanks a lot for the video!
great video, but im going to continue misusing it
🤨
why did this show up in my recommended thing?????
Thank you for this video, really informative!
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
Thank you! That was helpful
But... consistency!!!
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
indeed, go get the milk instead.
Simple solution: just don't wait for the child
Hey, I have the exact opposite problem where I don’t use it at all…
Do you have a video that cures that?
Could you cover the difference between findfirstchild and waitforchild
Amazing Tutorials Thx For The Help
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
are you going to continue doing things like this? cuz u got a new sub fr
Let me just whip out my notebook
i never had this problem
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
i never knew i had waitforchilditis, but after seeing this i got cured
can you make a video about your script editor? whats the font ur using?
when scripters need to wait for a child comes out from school:
the wait for child chain
amazing knowledge, taught me stuff i didnt know. instant sub
Thanks man I'm one of the people who have waitforchilditis
Oh it's a coding tutorial 😅
Hmmm... I'll keep using it anyways XD
Im waiting for my child
me:WaitForChild("Brain")
im sad that this is all basic knowledge to me but i still suck at scripting
Bruh i just do it without wait/findfirstchild if im absolutely sure that the child im searching for is there. (Assuming another script doesnt add it/its sımething like armour and waitforchild is necessary.. or not)
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.
so I will just abandon my child?
i use it when a free model uses it
Me who uses the WaitForKing() variable instead as it is more powerful:
literal child abuse...
i agree that developers should stop misusing their child()