I don't know if anyone else has said this, but it seems that if you set the Update mode to "Animate Physic" on the Animator, the method OnAnimationUpdate works with fixedDeltaTime instead of normal deltaTime. I hope it helps you all! ;D
Wow, I didn't know that these sort of state machines existed. Using enums is such a pain for complex things and seeing this is just great. Thanks for making the video
I have been using Unity for a few years now, but I never knew that the animator was so powerful!! Really great information in this video, even for more experienced developers.
I love this tutorial!! I'm taking my time right now, I was heavily inspired by square enixs final fantasy ultimania, so first I'm learning how to draw, then I will learn how to operate unity and blender! I got time, so I'll work hard at learning as much as I can
I believe the reason to use fixedDeltaTime on 11:45 instead of regular time.DeltaTime is because you are using unity’s rigid body which uses the physics system in all its interactions. Update and FixedUpdate don’t happen at the same time nor at the same intervals.
Im falling more and more in love with he Animator, I didn't even know it had these states in them, I've mostly been doing everything through script, just dropping them in the Animator, no transitions just call them from a script. Feels like I'm not using Unity right haha, thanks for this, I'm gonna look more into these things :)
You are going to be a legend Brackeys! The 1st game dev channel to hit 1M. I got featured today on Trending / Gaming and got like 2k subs from it. But for me thats still a big number. Im only at 8k subs. About to upload a new video.
Holy cow this was useful. Not only did it explain state machines but also how comparatively simple it is to do things this way. I've tried scripting behaviour manually and had a really hard time tracing which behaviour my "AI" was actually in. Now i want to make a 2D game. This looks really fun.
The wealth of concise instruction on your channel is amazing. Could you please make a tutorial on how to create a combo system with precisely timed inputs (e.g. Blazblue, MvC, FighterZ etc) using the animator? Either way, thank you so much for the content you provide :)
You are applying movement to a rigidbody, you need to use fixedDeltaTime and not DeltaTime because your outside of a FixedUpdate loop, so the "workaround" you're doing is actually the correct way to do it considering the way you're using your animator, but it's still wrong. The correct way is to use the `AnimatePhysics` update mode and don't multiply by time at all. Which for reference, the default update mode should follow the time scale, so I don't believe you need to multiply by time in it either. (if you weren't using a rigidbody that is)
Oh wow! Great video. We'll appreciate a sequel to this where you add 1 more phase to the boss with more mechanics/attacks or another boss style with more behaviours. More video suggestions (there are many topics lacking proper discussions and implementations explained for the people who are trying to learn gamedev): * proper dashing mechanic for 2d platformer character (invulnerable dash where he goes through the enemy and another vulnerable when he can't go through the enemy)
So about the dashing mechanic, the vulnerable dash should be easy, I think you only need to change the velocity to a certain value for a fixed amount of time or a fixed amount of distance, this way, the distance of the dash would be consistent. the invulnerability one, I guess you can make it work so that when the spite dashes, you can turn off colliders? Not sure about it. The simple AI mechanic could work using waypoints, I think _blactkhornprod_ made a video about it. Not sure about the other ones tho, sorry :/
@@Faun471 My implementation with a Coroutine for dashing: player.rigidBody2D.velocity = new Vector2((IsFacingRight ? Vector2.right : Vector2.left).x * dashSpeed, 0); then after X time reset the velocity to default Also I have IsDashing while the velocity is boosted so I use IsDashing in the animator to change the animation as well and about the invulnerable dash - just another boolean flag if it should be invulnerable - just SetActive(false) to the player's collider while Dashing. About the ground AI it's a little complicated than it seems - it has to patrol and chase depending on many things, for example polygon collider for visibility range (if player is in this range - chase), but if the player is in range and is in second range value for attacking it should switch to an Attack state then chase again then if the player is not visible back to patroling. It's a complicated task and there are many implementations - for example with boxcollider, polygoncollider and a raycast for the attack range. I have my imagination about the problems and I can brainstorm some mad ideas and implement them in some way. I just want to see more discussions, implementations for these interesting topics.
i love this HERO. I spent 2 days messing up my game. this modern-day hero saved me. saved my soul. but he's moved on now... foo fighters-theregoesmyhero
at 15:55 you should mention the attack mask should be set to should be set player, I spent a while fumbling around to work that part before I found that detail.
Dear @Brackeys, finally I found a channel who relases his scripts, is too very hard for me start programming and your codes are too useful for me, thank you!!! I support this channel and thanks again for the content!!!
I've been using scripts on the gameobject to control the behavior of enemies the whole time, probably to inherit properties from a more general enemy object. I never thought of putting the logic all inside the state machine. This makes it a lot simpler if you're not trying to do something too complicated.
Those complicated shortcuts make me always happy when I pay JetBrains for Rider (`CTRL` - `/` do the job... as simple as that, without need to re-assign shortcuts). On top of that, Brackeys would have had a suggestion that `Find()` is very expensive: press Alt-Enter for suggestion, then Enter to validate and he makes the whole job for you: Rider he would have had a suggestion that `Find()` to change the string to a static integer and changed the code to a 100x faster code. For anyone here, just give a try (I have no actions for JetBrains I just like to promote very good products!).
One line sprite flip in the OnStateUpdate() method: "spriteRenderer.flipX = player.position.x > rb.transform.position.x;" (ofc you need to reference your enemy's spriterenderer).
Great video on explaining how to work with state machines. I was about to do one for my channel but now I need to plan something else (I guess ☹) Interestingly this just came in time when I am doing a Melee Combat Enemy series 😬
Using fixed Delta works better because you're translating the object using the rigidbody. If you were just setting the transform directly, deltaTime would have worked fine 👌
Hi Brackeys! Hi everyone! I have two questions: 1 - Why are you using "public" instead of "[SerializeFields]" if you want to set a variable in the inspector? 2 - How is "animator.GetComponent" working? Shouldn't it be "animator.parent().GetComponent"? I dont' know if the "parent" function exists, I just mean that the rigid body is not linked to the animator, but to the animator's parent. Thanks for the answares
1. Yes he should. Actually, brackeys explain concept to very beginners, his code is really notmeant to be efficient / well written. It's just that it would confuse people new to Unity and coding but I also find that it just make them learn bad practice. If you want better coding tutorial, I would recommend Unity3dCollege. 2. GetComponent is working at sibling level, not parent, so it does work like that. You could, if wanted, fetch a component from the parent using component.transform.parent.GetComponent
So basically, Time.fixedDeltaTime is ALWAYS the same value (time between FixedUpdate runs), therefore speed is the same every frame as well. If you use normal deltaTime, it calculates time between Update runs, which depends on machine power so it can vary frame to frame so speed can be different. Hope that made sense.
It would be amazing if you could do a swinging tutorial video. I am trying to make a game that involves swinging in first person, and it would help me and a lot of other people a lot. Thanks again for all that you have done.
@11:50: the update delta (deltaTime or fixedDeltaTime) should depend on the animator's updateMode, though there might be some oddities happening. cool short summary though! i havent used statemachinebahaviours yet, but they seem useful.
ah i know why! it is because the rigidbody only updates on physicsUpdate! i dont think rb.MovePosition() changes rb.position directly, but waits until the next physicsUpdate loop to do so. so if you read rb.position in the next StateUpdate loop, you do not neccessarily get the last position you wrote during the last StateUpdate, but rather the one from the last physics frame. so fixedDeltaTime works correctly, because you write multiple times (with deltaTime) into rb.MovePosition(), but it actually only updates the rb.position every fixedDeltaTime, so you have to use this as movement-multiplier!
Was wondering if you could make a tutorial on creating a wall jump as struggling to find one that actually works. Appreciate the tutorials, really good for a beginner like me
This video was really helpful like usual. I’m finding the coding in game development pretty fun but I don’t have photoshop for game art and I’m just really bad at making players, grounds, enemies, weapons etc.
I actually tried out NordLocker because it's free. It seems like a great tool for anyone who is privacy conscious - the encrypted files are hidden behind a password, so it can even be used as a "homework" folder on a shared pc. The 5GB might not be enough for me so I'll have to use Brackeys' code to get the full version.
Can you do a video where you teach how to make AI in unity? And a +: this video is super useful And it has been uploaded just in the time that i want to set a boss in my game
He's done a video on pathfinding, but I think it's a bit outdated. Navigation is now installed by default, you don't need to import anything to the project
This is *exactly* what I needed right now. I was doing this previously using an enum and a switch case to manage state, but this is so much more dynamic!
`FixedDeltaTime` displays the delta time between physics cycles. You can see in the Unity lifecycle that `FixedUpdate` is part of the physics cycle, along with animations. Hence your animation script acting better with `fixedDeltaTime` . (note, multiple fixed steps can happen in a single frame) I highly recommend looking into the call order of the unity life cycle, for it can clarify a lot of those head scratchers.
Hello...a great tutorial yet again. i would like to request a tutorial ..a very specific one. of how to change body sprites of a 2d character that is already rigged and skined and animated with the 2d skeletal system of unity. Thank you for sharing your knowledge.
Hey, Brackeys! Will you be doing some advanced stuff? I know, there are lots of novices here, but honestly, this is one of the worst ways to make a simple boss, that just runs and attacks. I mean, so many scripts for that simple one. And what if your boss will have 100 states, would it be 1000 scripts? Thanks for your attention.
well i coded a whole bossfight through a monobehaviour script (it's a bit of a mess) , this seems like a much better way of doing things... effectivly the same as changing states with just code but MUCH more organized.
When you programmed an attacking system for all of your characters manually using code and checking for frames using if statements and Brackeys tells you 2 hours later that this can be done in animations using events....
That intro was fire 🔥
Literally xDDD
Hey yo, what’s up
s p i c y
Got into unity cause of you
Hopefully you read you are my coding hero
Teach me sempai 😂
But seriously thou you are my coding hero
I don't know if anyone else has said this, but it seems that if you set the Update mode to "Animate Physic" on the Animator, the method OnAnimationUpdate works with fixedDeltaTime instead of normal deltaTime.
I hope it helps you all! ;D
"Let's give this guy a sword."
"Why?"
"So he can shoot fireballs, obviously!"
XD
lol
lol
Bruh
"he shot me with a sword"
Wow, I didn't know that these sort of state machines existed. Using enums is such a pain for complex things and seeing this is just great. Thanks for making the video
I'd love to see a video about networking for multiplayer in 2d.
It will take a long time
yes you're right
there should also be a new one in 3d cause the old one doesn't work
Zayneb Moin for 3d multiplayer check Welton king! He is really good
Unfortunately Unity deprecated Unet and still haven't introduced their new multiplayer suite.
@@rollizle use mirror, it's unet but open source and actually supported with a discord server and it's all free
I have been using Unity for a few years now, but I never knew that the animator was so powerful!! Really great information in this video, even for more experienced developers.
wow no-one ever realised it was you lol
wow this is huge. this changes how i do everything in unity.
who watches the Brakeys videos on 2024?
I am
Me
I do
Most of them are outdated but still is alright.
Everyone lol he will never die
I love this tutorial!! I'm taking my time right now, I was heavily inspired by square enixs final fantasy ultimania, so first I'm learning how to draw, then I will learn how to operate unity and blender! I got time, so I'll work hard at learning as much as I can
So... How did this go?
0:20 **shows antibirth gameplay** ah, i see you're a man of culture as well...
It is actually The Binding of Isaac, forthcoming DLC boss the Witness.
@@FrostshadowStudios0310 it was in antibirth as well.
I believe the reason to use fixedDeltaTime on 11:45 instead of regular time.DeltaTime is because you are using unity’s rigid body which uses the physics system in all its interactions. Update and FixedUpdate don’t happen at the same time nor at the same intervals.
Im falling more and more in love with he Animator, I didn't even know it had these states in them, I've mostly been doing everything through script, just dropping them in the Animator, no transitions just call them from a script. Feels like I'm not using Unity right haha, thanks for this, I'm gonna look more into these things :)
You are going to be a legend Brackeys! The 1st game dev channel to hit 1M. I got featured today on Trending / Gaming and got like 2k subs from it. But for me thats still a big number. Im only at 8k subs. About to upload a new video.
Omg yess thx i was thinking what i could add to my first game and i thought of a boss and now you made a vid about it. THANKYOUUUU SOO MUCHH
So how’s the game
Holy cow this was useful. Not only did it explain state machines but also how comparatively simple it is to do things this way. I've tried scripting behaviour manually and had a really hard time tracing which behaviour my "AI" was actually in. Now i want to make a 2D game. This looks really fun.
The wealth of concise instruction on your channel is amazing. Could you please make a tutorial on how to create a combo system with precisely timed inputs (e.g. Blazblue, MvC, FighterZ etc) using the animator? Either way, thank you so much for the content you provide :)
12:23 *Michael Jackson entered the chat*
ouhhhhhhhhh.... Nice meme... AHAHAHAHAHA
lengendary moonwalk
I thought you were referring to the change in skin color.
@@SystemOfATool It is absolutely referring to the reverse walking
@@EdwinCreatives haha yeah, i got that after clicking the timestamp
Would definitely love to see a health bar video !! I've got a project I'm working on for my degree and that would be really cool !
Great state Transitions! One of the best methods I have seen..definetly a try for the next boss
Wonderful! Exploded my mind 🤯
Before this I tried to control states through script only, now it’s gonna be a lot easier.
You are applying movement to a rigidbody, you need to use fixedDeltaTime and not DeltaTime because your outside of a FixedUpdate loop, so the "workaround" you're doing is actually the correct way to do it considering the way you're using your animator, but it's still wrong. The correct way is to use the `AnimatePhysics` update mode and don't multiply by time at all.
Which for reference, the default update mode should follow the time scale, so I don't believe you need to multiply by time in it either. (if you weren't using a rigidbody that is)
Brackeys is the ultimate boss fro game dev tutorials
I still suck at animators/animations. It'd be cool to see more of this!
If your boss doesn't move make sure 'root motion' is checked
This allows the animation to make movements
where can i do that pls reply fast
figured it out THANKSSSSSSSSSS
God bless your soul my friend
thank you so much
I wanted to leave at the beginning of the video but I realized that it was Brackeys, it's normal!
whatever good video!
Oh wow! Great video. We'll appreciate a sequel to this where you add 1 more phase to the boss with more mechanics/attacks or another boss style with more behaviours.
More video suggestions (there are many topics lacking proper discussions and implementations explained for the people who are trying to learn gamedev):
* proper dashing mechanic for 2d platformer character (invulnerable dash where he goes through the enemy and another vulnerable when he can't go through the enemy)
So about the dashing mechanic, the vulnerable dash should be easy, I think you only need to change the velocity to a certain value for a fixed amount of time or a fixed amount of distance, this way, the distance of the dash would be consistent. the invulnerability one, I guess you can make it work so that when the spite dashes, you can turn off colliders? Not sure about it.
The simple AI mechanic could work using waypoints, I think _blactkhornprod_ made a video about it.
Not sure about the other ones tho, sorry :/
@@Faun471 My implementation with a Coroutine for dashing:
player.rigidBody2D.velocity = new Vector2((IsFacingRight ? Vector2.right : Vector2.left).x * dashSpeed, 0); then after X time reset the velocity to default
Also I have IsDashing while the velocity is boosted so I use IsDashing in the animator to change the animation as well and about the invulnerable dash - just another boolean flag if it should be invulnerable - just SetActive(false) to the player's collider while Dashing.
About the ground AI it's a little complicated than it seems - it has to patrol and chase depending on many things, for example polygon collider for visibility range (if player is in this range - chase), but if the player is in range and is in second range value for attacking it should switch to an Attack state then chase again then if the player is not visible back to patroling. It's a complicated task and there are many implementations - for example with boxcollider, polygoncollider and a raycast for the attack range.
I have my imagination about the problems and I can brainstorm some mad ideas and implement them in some way. I just want to see more discussions, implementations for these interesting topics.
Thank you very much brackeys
i love this HERO. I spent 2 days messing up my game. this modern-day hero saved me. saved my soul. but he's moved on now... foo fighters-theregoesmyhero
That's a lot more fun 😮
at 15:55 you should mention the attack mask should be set to should be set player, I spent a while fumbling around to work that part before I found that detail.
Thank you this was my problem as well.
Jk
Just a Quick idea: you could give damage resistance to the boss whenever its enraged
He did that in the video
Dear @Brackeys, finally I found a channel who relases his scripts, is too very hard for me start programming and your codes are too useful for me, thank you!!! I support this channel and thanks again for the content!!!
Brackeys your way too awesome. No wonder people come to this channel. He literally covers all topics and aspects of game development.
Best tutorial. It helped me so much. You explain it soo good
when the sponsor is actually something that you've been looking for
I've been using scripts on the gameobject to control the behavior of enemies the whole time, probably to inherit properties from a more general enemy object. I never thought of putting the logic all inside the state machine. This makes it a lot simpler if you're not trying to do something too complicated.
9:00
Ctrl + k, followed by Ctrl + u (Ctrl + c for making the selection a comment) does the same thing.
I think ctrl k ctrl c is a toggle for commenting in VS
Those complicated shortcuts make me always happy when I pay JetBrains for Rider (`CTRL` - `/` do the job... as simple as that, without need to re-assign shortcuts). On top of that, Brackeys would have had a suggestion that `Find()` is very expensive: press Alt-Enter for suggestion, then Enter to validate and he makes the whole job for you: Rider he would have had a suggestion that `Find()` to change the string to a static integer and changed the code to a 100x faster code. For anyone here, just give a try (I have no actions for JetBrains I just like to promote very good products!).
What are you guys trying to control
You mean 8:57?
I remapped it to Ctrl+; (I think it is Ctrl+/ in English layout) so it match good editors like Sublime and VSCode hahaha
*little did he know that the binding of Isaac boss he showcased was from a mod*
Well, technically, this boss is gonna be added in isaac's next dlc, repentence, wich is coming out really soon.
Doesn't matter. Most Isaac bosses, items etc. come from mods or community suggestions.
@@kyanislacouture9188 yeah, "really soon"
@@kyanislacouture9188 now lol, 1 year is really soon? idk
@@facundorome.4190 is it out
One line sprite flip in the OnStateUpdate() method: "spriteRenderer.flipX = player.position.x > rb.transform.position.x;" (ofc you need to reference your enemy's spriterenderer).
Blackthornprod references is nuts
21:07 WHOO
That boss at the beginning: You face jaraxxus!
Brakeys: Get away.
Sounds: (flick sound )
uhh yeah. that is indeed what happened. autistic comment
Great video on explaining how to work with state machines. I was about to do one for my channel but now I need to plan something else (I guess ☹)
Interestingly this just came in time when I am doing a Melee Combat Enemy series 😬
Using fixed Delta works better because you're translating the object using the rigidbody. If you were just setting the transform directly, deltaTime would have worked fine 👌
@Brackeys yes, as you surely may know, rb needs FixedUpdate to work fine. Thanks @Nathan Sheppard
this is gold
Again,a very simple AND useful tutorial !!
You should make a turtorial on other, yet more important things, like main menu, star position, goal, etc..
Somehow you guys are putting out EXACTLY the videos I need, I love it!
I would love a health bar tutorial!!!
Well there is a video by Alexander zotov showing us how to do it..recommend u check it out..its really helped me...unless u wont it from brakeys;)
@@maistrogaming7911 link?
Yes do a video on health bars
awesome coding and technique thanks
2:54 is where it truly starts
can you make a tutorial about how to make a grappling hook
That's been done look up the RUclipsr dani
@@MonsterClaws_ but Dani haven't made a... Tutorial? He just shows that he made one...
He still puts the coding and design up in his video
@@MonsterClaws_ oh, thank you, I did not know that, maybe you know when he puts it up?
@@Dreamless_Ghost usly in the Description but sometimes he shows the code in the video
Super quality. Thanks for this.
This tutorial is GOLD
Thank you for this tutorials!!
This video has enlightened my life. Thank you.
I really liked the video.
I learned a lot about situations.
It can help me later on in the game I'm working on, keep making such great videos!😀
Cool! I dare you to make portals to teleport. Keep it up bro!
hey, he doesnt make videos anymore, sorry
@@rabanaqueroman didn't age well.
you are so close to 1 mil subs!
Hi Brackeys! Hi everyone! I have two questions:
1 - Why are you using "public" instead of "[SerializeFields]" if you want to set a variable in the inspector?
2 - How is "animator.GetComponent" working? Shouldn't it be "animator.parent().GetComponent"? I dont' know if the "parent" function exists, I just mean that the rigid body is not linked to the animator, but to the animator's parent.
Thanks for the answares
1. Yes he should. Actually, brackeys explain concept to very beginners, his code is really notmeant to be efficient / well written. It's just that it would confuse people new to Unity and coding but I also find that it just make them learn bad practice. If you want better coding tutorial, I would recommend Unity3dCollege.
2. GetComponent is working at sibling level, not parent, so it does work like that. You could, if wanted, fetch a component from the parent using component.transform.parent.GetComponent
@@Jichael38 Thanks! ;)
thank you man
you are awesome
Excellent bro. You rocks!
12:27 the eay he walks is like a perfect moon walk
Thank you for the lesson
Good job!
So basically, Time.fixedDeltaTime is ALWAYS the same value (time between FixedUpdate runs), therefore speed is the same every frame as well. If you use normal deltaTime, it calculates time between Update runs, which depends on machine power so it can vary frame to frame so speed can be different.
Hope that made sense.
thanks bro
Health Bar Video HYPE!!!
best intro ever, bud ... luv ur vids !!!
It would be amazing if you could do a swinging tutorial video. I am trying to make a game that involves swinging in first person, and it would help me and a lot of other people a lot.
Thanks again for all that you have done.
You are the best.
Thank you. good tutorials !
@11:50: the update delta (deltaTime or fixedDeltaTime) should depend on the animator's updateMode, though there might be some oddities happening.
cool short summary though! i havent used statemachinebahaviours yet, but they seem useful.
ah i know why! it is because the rigidbody only updates on physicsUpdate!
i dont think rb.MovePosition() changes rb.position directly, but waits until the next physicsUpdate loop to do so. so if you read rb.position in the next StateUpdate loop, you do not neccessarily get the last position you wrote during the last StateUpdate, but rather the one from the last physics frame.
so fixedDeltaTime works correctly, because you write multiple times (with deltaTime) into rb.MovePosition(), but it actually only updates the rb.position every fixedDeltaTime, so you have to use this as movement-multiplier!
Was wondering if you could make a tutorial on creating a wall jump as struggling to find one that actually works. Appreciate the tutorials, really good for a beginner like me
Thanks for the videos Brackeys. Will definitely use these in one of my videos soon. Thanks :)
0:21 Some great the binding of isaac canon boss...
This video was really helpful like usual. I’m finding the coding in game development pretty fun but I don’t have photoshop for game art and I’m just really bad at making players, grounds, enemies, weapons etc.
I actually tried out NordLocker because it's free. It seems like a great tool for anyone who is privacy conscious - the encrypted files are hidden behind a password, so it can even be used as a "homework" folder on a shared pc. The 5GB might not be enough for me so I'll have to use Brackeys' code to get the full version.
How do you create such cool animations from scratch?
super helpful and clear tutorial Brackeys! Thank you :)
Can you do a video where you teach how to make AI in unity?
And a +: this video is super useful
And it has been uploaded just in the time that i want to set a boss in my game
He's done a video on pathfinding, but I think it's a bit outdated. Navigation is now installed by default, you don't need to import anything to the project
This is basically it. State machines is one of the main ways to do AI in games.
Thank you for your help!
An all around great tutorial. Thanks as always for the great content
It's good brackeys now have boss fight tutorial
Almost to 1 million!
This could be really cool for fighting games
Wow, thanks a lot, that helped me a lot for my project
This work in 3D ?
Awesome tut. Thanks
This is *exactly* what I needed right now. I was doing this previously using an enum and a switch case to manage state, but this is so much more dynamic!
I have problems with making my own 2d PlayerController script and
I already watched your Video 😢
Btw I am German
`FixedDeltaTime` displays the delta time between physics cycles. You can see in the Unity lifecycle that `FixedUpdate` is part of the physics cycle, along with animations. Hence your animation script acting better with `fixedDeltaTime` . (note, multiple fixed steps can happen in a single frame)
I highly recommend looking into the call order of the unity life cycle, for it can clarify a lot of those head scratchers.
Hello...a great tutorial yet again. i would like to request a tutorial ..a very specific one. of how to change body sprites of a 2d character that is already rigged and skined and animated with the 2d skeletal system of unity. Thank you for sharing your knowledge.
Yes, please explain the programming of a health meter.
This work in 3D ?
thanks for the material, like, subscribed and greetings from Bolivia
Hey, Brackeys! Will you be doing some advanced stuff? I know, there are lots of novices here, but honestly, this is one of the worst ways to make a simple boss, that just runs and attacks. I mean, so many scripts for that simple one. And what if your boss will have 100 states, would it be 1000 scripts? Thanks for your attention.
well i coded a whole bossfight through a monobehaviour script (it's a bit of a mess) , this seems like a much better way of doing things... effectivly the same as changing states with just code but MUCH more organized.
When you programmed an attacking system for all of your characters manually using code and checking for frames using if statements and Brackeys tells you 2 hours later that this can be done in animations using events....
man i just came here to say the same *screams internally*
Awesome video !
22 minute video finally finished in three days!