MELEE COMBAT in Unity
HTML-код
- Опубликовано: 14 дек 2019
- Learn how to make melee combat in Unity!
Check out NordVPN and get 81% off: nordvpn.com/brackeys
Coupon code: BRACKEYS
● Listen to DuckTapes! www.ducktapes.fm/
● Bandits - Pixel art: assetstore.unity.com/packages...
● 2D Movement: • 2D Movement in Unity (...
● 2D Animation: • 2D Animation in Unity ...
● New Input System: • NEW INPUT SYSTEM in Unity
···················································································
♥ Subscribe: bit.ly/1kMekJV
👕 Check out Line of Code! lineofcode.io/
► Join Discord: / discord
● Website: brackeys.com/
● Twitter: / brackeystweet
● Instagram: / brackeysteam
····················································································
► All content by Brackeys is 100% free. We believe that education should be available for everyone.
❤️ Donate: www.paypal.com/donate/?hosted...
····················································································
♪ "ES_Dress Code_Black - oomiee" by Epidemic Sound
"He gets hurt and he dies. Awesome!"
Damn, that's quite awkward out of context.
Death is awesome. You should try it sometime.
@@AbirHasanDipu as you have tried before
out of context at 18:22
@@snekpliskin Police will find out that there are multiple people involved as the word "lets" is used. Run !!
1k th like:)
Awesome video, and enjoy your holiday break! Looking forward to 2020 Brakcyes! :D
What are you doing here dani haha
You are here because you are going to do a 2D melee combat game...(or you cant do that?)
Y e s
Yes brakcyes, eeeh wait... BRAKCYES? 😂
@@jansasinowski7319 He likes to see Brackeys videos
"so, lets slice up some enemies"
*slices himself*
You think Brackeys is trying to send us some type of cryptic message??
slies?
You are your biggest enemy
it was the view of the enemy...
@@FreeD00M oh, shit, I'm sorry, you're right
This has an issue tough . The overlap circle gets triggered exactly the moment we press attack button , and if we have a longer animation , we will miss all the enemys we want to hit . This happened to me but it can be fixed using Animation Events and simply put all the attack code except the animation trigger in a new public attack function and then call it from the animation at the right time. And then , in our code we just trigger the animation when we press the attack button . A great tutorial tough ! Love it
This is actually a really good suggestion, thanks! :D
You can us IEnumerator
how? pls help or show code.
@@paulwin9036 For the timing?
I think using Animation Events is easier to set up and use, because you can actually see the animation while setting the event.
you just made my day thank you so much!
Wow the timing could not be more perfect I really needed this and all the other tutorials I found were low quality
Ikr same. I'm working on a super Smash Bros game and just got working on the combat
@@mattice9083is it a smash like game or a smash fan game?
Meh more 2d fighter more similiar to towerfall but with sword combat and shurikens
The beauty of starting out in Game Development, the awkward struggle to figure out something as simple as this, being frustrated, and then just happening to stumble upon a video like this. This video is great and makes things so much simpler than what I was trying to do, thank you.
Literally same fucking thing *just* happened to me. So funny
I’ve watched a lot of RUclips videos and series on scripting and Unity. This channel is by far the best, and most effective way to genuinely learn that I’ve come across.
By far the best melee combat system tutorial i ever watched.
Your videos are productive and very entertaining,please continue.
I have been struggling with this all week and this explained exactly how to do it. Thank you!
Hi, there are some in comment ask how to do combo attacks. So just thought to post my reply here (animator side only):
There is actually a easy way to do that. In the animator, create an Idle State and your 3 attack States and a Boolean variable. Make each state a transition to Idle on condition the Boolean variable is False. Then also make transitions to link from one attack to another on condition the Boolean variable is True. Therefore as long as the State detect the Boolean is True it will play the sequence of attack. And if it detect a False, it will return to Idle state. However there are many ways on the input implementation side depending on your code. And also how the combo is execute like do the combo execute as long as the button is press 3 time or press on specific time or as long as button is depress. So I left it up to you.
Wouldn't it be better to use an integer instead?
That way, you can make sure only one value for attack animation will be valid at a time.
Also, how about using a blend tree? (Even though the main purpose of a blend tree is too blend animations.)
@@sharif47 I wouldn't recommend using blend tree.Since most of the time you want the attack animation to be played fully and blending attacking animations does look terrible and can cause lots of problems.
if you have hitboxes that depend on the lenght of the attacking animations.
For example 2) Sword hitbox getting activated on the start of the attacking animation and disabling on the end of the attacking animation, using blend tree you would have to create a system that reads data from the animator and sends it back to the player so that the hitbox gets activated/disabled at the right time.
Hey, i'm interested in making a combo with 3 attacks, wich is the code i shloud add to make it (I have the things of your comment already)
Recently found your channel, it has since really been helping me in Unity! Much thanks, Brackeys! :)
Your 2D series is very helpful, thank you. Please do more!
Wow video came out exactly while I was having a problem doing this 😁
same lol
Hey brackets, your channel has got me obsessed with learning how to code, I’m trying to find time to do it and I will watch all your tutorials.
Anakin Skywalker his name is brackeys
Definitely worth it, he is amazing at explaining how to create games of multiple genres in unity.
Brackets👏👏👏
@Fate I love how insults in game dev comments are like passive aggressive and almost inspirational, but in every other comments section its STFU STUPID. LOL
No you won't lol
Thank you! I saw your old videos about 2d shouting and top down. I used an old melee system. Now I can use an optimize system.
all year I've had problems with attacking in my game and this video lit up so many light bulbs for me on how I should do it! thanks!
Thank you so much for these videos, Brackeys! First time learner or unity and your information and presentation is easy for me to keep along with. really thanks a million!
Just a note, if you are doing 3d from a first person perspective, you don't want to sphere cast.
Just a ray cast with a maximum distance, or simply attach a simple collider to the weapon you are using and check for collision on that as trigger only.
I can't belive it, I was just searching for a mele combat for my 2d game to implement it. And you posted this video, just on point.
This was a better tutorial and gave me a better understanding than much longer and more involved ones in how to use unity.
This took me way longer to figure out than it should of, but if you're having the issue where you can attack your enemy from one side, but not the other, its because the "attack point" circle is placed IN FRONT of your character. To fix this, move the attack point to the CENTER of your player model, and size the attack point around you. Where-ever that attack point circle touches, you can attack. hope this saves someone hours of googling and item searching. I only figured it out from watching another video. Hope this helps.
can you tell me what the other videos title was? I'm struggling with this tutorial also.
@@madrain3941 The video didn't address anything specifically with this tutorial. It was showing something else and I just happened to notice that there was a gizmo wrapped over the center of the player and thats how I figured it out. You can write a script that rotates the attack point with the player that will help with the player attack from only the right or attacking 'behind' you.
holy thank you so much i was just struggling with that!
But then you could attack enemies that are behind you right? Maybe theres a way to check wich side are you looking at, i have the same problem but didnt check if that would work or how could i do it, if you figured a better way to do it and you can tell me that would be really helpful
@@migue4044 Yes! This was written when I was still learning more about this also.
Eventually I found a way to make the attackpoint flip when the player does. So if the player was facing -1 then it would be facing the left, and if the player is facing 1, it goes to the right. Just plug them in with your Flip functions.
You could also go to GPT and ask for a "offset" script that you can plug into your attackpoint gizmo and have it specifically positioned. so you can adjust the gizmos range on the X and Y.
Thank you very much for this video! I have struggled to make a melee combat work since forever and been stuck doing platform shooter games instead...this is a game changer for me!!!
Just to add on, if there's a melee combo system that works with the method you used in this video, it would be great if you could post that as well!
I know right bro, melee combat just add another flavor to the game. Not just melee combat for Player but it's great to have enemies which actually attack player.
I am covering the Enemy Melee Combat system on my channel. You might love it too
took me so long to find a video to show how to make a health/damage system thats easy to understand, thank you!
Made me feel better about my melee system. The script got a little more complicated when I tried to it compatible with all basic colliders and compound ones. The main difference is that my "hit point" tracks the weapon bone and it needs to be check every fixed update during the animation. I ended up combining it with a StateMachineBehaviour to confine the checks to the animation and cashing the collision log between checks to prevent redundant calls.
I also made a pseudo "collision info" object to store some basic info that I use for effects and knock back. I was kind of worried that I was over complicating things. But I just couldn't figure out how to make something behave like a trigger but still get physics info I need with the built in system.
I ended up learning a lot about StateMachineBehaviours. They are pretty cool and I never see anybody mention them.
My Brain: See this!
Me: But I'm not a game developer
My Brain: Just in case...
My brain: See this!
Me: But I already created my own method of melee attacks and it works very well.
My brain: Just in case
funny thing that i don't understand almost everything in this video but i got the idea how it works
@@stenty8464 way to go, smarty pant
why stop at one pant
@@user-og7wl5yi3f what is it
Geez Brackeys you make it look soo easy, I tried for *months* to do this with a little success in 3D and you make it in around a half hour :P
Thanks man :D
I figured how to do it alone after like a month of making ambitious yet impossible to complete games so it's not this hard. Maybe you're not really working on it just launching unity for 10 minutes a week.
@@madpancake9891 You're such a special little snowflake :-)
@@madpancake9891 Yeah? Well I got all the golden berries in Celeste. Get on my level.
@@beri4138 I'll never beat you, but I'll try senpai
@@emailakkont6520 yeah i was trying to make it sound funny, not smart-assy, kinda stupid as I've trashed Unity just after writing this comment.
Oh, man! I've been waiting so long for this!
Best melee combat video i've seen, very simple and intuitive.
I see at least a few people asked about flipping the attack point. Since I bet moving the character to the left is just an X-flip of the animation, the attack point stays to the right of the player all the time (this being in my view a bug). My recommendation would be to do some vector math from the center point of the character while taking into account the direction the character is facing. You can easily store these vectors in a variable and tie them to your controls. This is not saying this video is not AWESOME and SUPER HELPFUL as everything else Brackeys does. THANKS BRACKEYS!
Brackeys: *Makes an if statement to prevent errors
Unity's errors: You can't escape me that easily!
I love your videos. I found you when I first watched your "love is blind" game jam. I wish there was someone like you for Unreal as thats what I am being taught in college, but I enjoy your vids anyway
This is so helpful. Thank you so much for including so much detail.
any chance of getting a combo system tutorial? Doesn't need to be complex, but I'd love to see how you tackle things like stringing together attack combos, but allowing for a chance to drop the combo if the keys are pressed too fast or something
u guys can run the attack function in a animation event if u want timing with your attack animations but u have to to play the animation when u press the key and remove the attack function from there because its gonna run in the animation :D
Yeah, I make it too. 😁
This one of the only helpful comments in this brain-dead comment section.
Aqua Armour thanks 😅
No experience with Unity, mainly a web dev, some C# knowledge, and damn, your videos make everything seem extremely simple. Makes me want to make a game.
Thank you for the Alt+arrow keys shortcut!!!
Great tutorial! Thanks!
...even though you're gone.
Unless I completely missed something, I think there's something skipped over in the tutorial?
Attack() is called on space being pressed, which should on that same frame immediately find the collisions and output the debug/damage.
What is shown is a delay with the attack windup before the strike occurs, instead.
Were you able to solve this problem ?, I also have it
This works great for my heavy action games. Thanks, man. I'm busy on a game that looks like Super Smash Brothers, just in a 3D environment, not 2.5D.
That cut in the start is very smooth!
if you want to simulate the attack in physics you can make disable the collider of the melee and when you want the player to hit something in the animation add a key frame of enabling the collider and after that frame disable the collider this is a solution of many problems in the comment section :D
But with this method you can't use brackey's health system you should use the OnCollisionEnter2D
My death-animation from the Enemy does not stop
Disable looping in the animator...
Exactly what I needed. For me it's probably your most useful video yet!
Your tutorials are so easy to follow that I'm pretty sure a baby could make a successful game with your tutorials alone 😃
😆
Well I'm trying!!
Ehh. Honestly a baby would need to also have a computer which is pretty unlikely. And I don’t think a baby would understand most of the computer terms so you’re kinda wrong..
@@xXTheivesGuildXx /woooshh
@KaiVideoSYT no it's r/woooosh
I would love to see a tutorial on tactics games (games like advanced wars or fire emblem)
Nice profile pic!
@@ZiRR0 thanks I drew it myself
@@theonetruedonut Mind telling me what program you used?
@@ZiRR0 Gravit Designer but I also recommend Inkscape
@@theonetruedonut Thanks!
Fantastic, Ive had trouble understanding that Physics2D circle, command for a while, and you combined it with an array, and I still understood. Brilliant
Well you can use. Debug.DrawRaycast thing to see where the hitbox is at.
Yay!! I made a few tests on 3d and worked. Thanks!! Now studying combos.
It is really really simple and easy to learn. thanks~
aiidiasdwass
I see Dani in all the game development videos I watch lmao
I'm having the issue. With this method player can attack thru walls (colliders). Does someone have a solution to this problem?
I love these videos!!! Have an awesome Christmas and New Year Brackeys guys!
1:18 absolutely Quackers mate 😂
Love your content. I wish I could teach Unity like you. I try my best :)
Nice.
If you were not there I would not have been able to make combat system for my game and I tried a lot making that on my own but failed then I came to your video that I remembered that you made thanks you are a saver and a god of game development
THANKS A LOT
Amazing vid rly gave me insparation to not give up and start with Unity again
Please do another beginner game series i'm not even a beginner and i want another one.
it's just fun to do
So for the floor in my game I used a tileset with a box 2D collider which means whenever the enemy dies it falls through the floor anyway to fix this also whenever I attack the enemy I can swing as fast as I want and other than that this is a great video and has been tons of help.
Also using a tileset and had the same issue, this line before disabling the collider will keep the enemy in place
GetComponent().isKinematic = true;
@@senkerog Thanks!
use "animator = GetComponent();" in update
I learned so much from just watching your vids! Thank you for the great content
Man I love the way you work so hard on your videos, but put minimal ads!
Awesome video! This helped me a bunch!
One question though:
How do you make the attackpoint flip to the other side when you sprite fliX?
Set the localPosition on the transform to a negative vector2
@@InternationalConglomerate in script or in editor
@@GameAdonis In script, you want to set it so that it will flip to the corresponding direction you are moving programmatically. Depending on how you do it you may need to put in some checks to make sure it isn't already on the correct side or it will flip back and forth constantly as you walk.
@@InternationalConglomerate I had this same issue, and what I wrote was
attackPoint.localPosition = new Vector2(-attackPoint.position.x, attackPoint.position.y);
but when I play test it as soon as a i start to move the attack point vanishes. help? 😅
@@evan73858 When it moves, double click the objects name in the hierarchy, should move your scene view to wherever it is. Likely it's a problem with the vector2 math. Could try changing attackPoint.position.x to attackPoint.localPosition.x as just from a glance I think that might be your problem.
The position variable is going to be completely different from the localPosition variable so if you make it negative based off Position instead of localPosition it will be entirely different coords.
Pls, do a tutorial on the new ECS (DOTS), and the newmultiplayer packages
I'd love to see a video on how to use the multiplayer system from the FPS Sample in a new project. I'd also pay for it.
@@aleef1735 yes the new unity multiplayer stuff desperately needs looking at and some proper tutorials and documentation.
Yes
Birger E yes I need to figure out multiplayer for my game
Yes, please do this!
This helped me a lot! Thanks so much. You won’t be forgotten
This was an overwhelming information but very GOOD! Thank You so much for the help!
Quick question, would it not be better to determine your attack time with the animation length and/or speed?
It would be better
Hey Brackeys!
I really love your content and it always helped me!!
Could you please make fps series (Hand + Gun animations) because the old series were old and the was a boring gun with no hand animations.
It would be very nice!
Thank you for everything!
This is what i am looking for. Great tutorial. Keep it up!
The advertisments on these videos are the best
Could someone help me? :D When i press the attack while walking, the animation freezes and don't back to normal. Seems like a conflit between 2 keys pressed at same time. How do i solve it?Like, presse attack while walking and after release attack key, keep walking? Thank you!
Amazing. If there is one thing I would add though, its this:
Most games have more than one enemy type. Instead of retrieving the enemy script you should use a IDamageable interface. Or have all enemies inherit from an abstract/base class and override its TakeDamage() - then upcast the enemy scripts and run the function that way.
Or a third option would be SendMessage(), which runs the given function on all scripts attached to a gameobject if they exist. (Though you can't pass a param, so the last one requires a workaround.)
Those are some good examples on how to improve the system, thank you for mentioning them.
But i think you can send paramters with the SendMessage() method, in fact it is used in the example from Unity to damage an enemy.
docs.unity3d.com/ScriptReference/GameObject.SendMessage.html
Been waiting for a video on Melee!!
thanks brackeys your tutorial videos help me a lot in our group project. :)
Very cool tutorial! I also use a similar technique in my melee combo system in one of my tutorials!
Oh hi there! :D
@@telemonofficial6924 Hello! :)
Had premade enemies (watched another tutorial by other creator) and my hits were not connection, in other words I was calling "attack()" method, but nothing was detected. Turns out you need a box collider 2D to make it work. Overall really good tutorial.
Been trying to get this to work for the better part of an hour. Thank you very much
You should also add check for the attack rate. If Its 0 your code will crash instead of dissabling attacks as i would expect, for example if I would be doing something like no-combat zone... But awesome tutorial, I learn a lot!
Hey Brackeys love your videos! And tutorials they’re so easy to follow along however I’ve got a request, is it possible for you to upload a tutorial on Helicopter controls/ helicopter physics?
Thank you for the video Brackeys! I have only one issue though. The error "object reference not set to in an instance of an object" appears each time the attack button is pressed, inside the loop code: foreach (Collider2D enemy in hitEnemies) {enemy.GetComponent().TakeDamage(attackDamage);} Any suggestions to solve it?
i'm getting this same problem, did u fix it?
@@bonnyxavier7661 I had the same problem and it was because my "Enemy" script was actually named something else. I fixed it by changing what was inside the to what my "enemy" script name was
I know this is old but pretty sure there are people watching these vids even today. So, the comment above mine should fix the problem IF that is the problem you are facing but if not this might be it, for those who choose to group their enemies in a parent object and attach the script on it will also face the same issue. Attach your script to each enemy independently, hope that helps.
@@dennisdzeko3916 I'm actually having the same issue: "object reference not set to in an instance of an object"
I checked the scripts name and they are fine, and I don't have enemies grouped to a parent object. I'm literally banging my head against the wall...
Next one has to be "Melee Combat COMBOS in Unity", or something about attack sequence, because repeating the same animation over and over isn't really beautifull for the player. It would really help a lot
Nice video btw
Quim Torra just need a static variable and attack based on that
Yeah i couldnt figured out combo system too. How can i check for second attack i couldnt find.
Blasphemous and Hollow Knight disagree
It would be really useful to see a combo system in working
Appreciate this... hoping to make a fighter game sometime in the near future.
Awesome tutorial, this exactly what I was looking for and works like a charm. However since disabling enemy collider on death the enemy just falls through the ground. How do I get him to not fall through the ground and just lay on top of it like you have displayed in you video?
I figured something out, not sure if it's the best way to do it but I set the gravity on the enemy Rigidbody2D to 0 I'm hoping this wont effect anything when I go to create a patrol path for the enemy AI.
@@iZahvi it will make enemies killed in "air" not fall down.
@@DayOfCasual This is not too big of a deal for me as none of my enemies move along the vertical axis so they don't get caught in mid air except for my ghost but I have a death animation for him that he just shrinks until he disappears, though I may add other enemies later like bats that would not shrink before disappearing. Is there a better way to achieve having the enemy not fall through the floor on death before being destroyed?
@@DayOfCasual any other way to fix the problem?
@@thenacho6354 This is a little late but if you specify what type of collider your attack will hit IE specifically box colliders, then you can give the enemy one box collider and one collider of another type and only disable the box collider when he dies, that way he doesn't fall through the floor once you disable his box collider. Not sure if it's the most elegant solution but it seems to work for me.
Hope someone answers.
Why is my enemy falling through the tiles when he dies?
It plays the death animation but he just falls through.
By any chance, is your collider set to be a trigger? In that case, the collision physics won't work
Same problem here, did you find a solution?
GetComponent().simulated = false;
i ended up adding this to the void Die() method to disable gravity on the dead enemy model
That's because you disable the collider when it dies. So if it is affected by some kind of gravity, it will fall through everything.
I think a good way to avoid it would be to not disable the collider but instead change its layer and play with the layer matrix so the player won't interact with dead bodies. Putting it to background or whatever.
I thought about it watching the video, hope it helps
did you disable the script as in tutorial? You just need to disable correct component responsible for gravity.
6:36
This seems so rigid. What happens if I have an attack speed modifier that effects the exit time?
I might be wrong, be the "1" value for the exit time should be read like "100%" (of the previous animation). It's not bound by the exact duration of the attack animation.
What an epic tutorial. Also, maybe I'm just getting clever but I felt it was really well explained!
How do you prevent reducing enemy health more often then once, in case the collison is true for more than one frame, I wonder? By the way ... you are a gifted teacher, great tutorials!
I know this is an old post, but did you ever find a solution for this? I am using skeleton animation and I get like 10 collisions on the same object hahah. Still looking for a solution.
@@sheanstanks you can always do what he did in the last two minutes of the video to limit the attack rate, but do it to the enemy scripts take damage function. Just have the program skip over it if only a few milliseconds have passed
Did you find a solution?
@@sSpectralls Add in Collision Event: Limit Conditions -> Only One Action When Event Loops
EDIT: Forget it - What I wrote refered to MultimediaFusion 2. Sorry!
Make sure the Gizmos button in checked in the editor! I repeat, do not waste an hour trying to get OnDrawGizmosSelected to work because you didn't check the button and now you hate yourself because you ate half a cake to get through the stress!
God bless you
Can you please elaborate ? I am stuck on that exact step. My player combat script simply isn't accepting the acceptpoint. If i drag and drop, it appears for a sec, and then it is again set to None. Pretty sure my gizmos button is set to on though.
Jfc man, I've just wasted an hour trying to figure it out, I wish I see your comment sooner
Brackeys, your videos are great! They helped me so much! In the future I will consider subscribing your Patreon.
All that free knowledge ❤️
Thank you Brackeys ❤️
18:21 'He gets hurt and he DIES...Awesome!"
Is it OK to attach collider to the weapon directly? I'm in 3D.
I'm no developer, but I do think you need to ,so in order for the condition you gave to activate like in brackeys case display enemy hit
Depends on the kind of combat system you want to make. Some games can be forgiving and say that an attack "hit" if a valid target is within a specific area. Others can be more punishing and check for actual collisions between the edge of the weapon and the target and the speed difference at the moment of the collision.
In general it is okay to attach collider to the weapon directly, no matter if you are in 3D or 2D. But it is not the best method to approach it.
I always suggest to have hitbox on a separate child object as it gives you more flexibility and control over your hitbox. And you can easily make changes to it without messing the sprite or textures
@@SidMakesGames that is the actual way they do it in SSBU.
Edit: also you want to use primitives for your hitboxes because they're highly optimized.
@@haaly7245 I know right, that is the best method to approach it
Also on primitives point, definitely, it is generally best to use primitives specially when you are creating a game like Street Fighter or SSBU where even mini-seconds matter
Nice video as always ! Hey how about making the content about the combat with hitboxes, hurtboxes, frame, etc like the any fighting games around :D
I just want you to know that your videos have really helped me a lot
Seriously
just create a variable that can influence the attack rate, and that variable is influenced by the number of enemies killed.
Then u get faster the more you kill.
evolution is always the best thing in games.
I have an issue: the enemy keep playing death animation in loop even if I put ExitTime to 1 in the animator... Can someone help me please ?
I’ve hope someone will help because I have the same problem :(
just disable loop
this is the best tutorial ive seen out there
Blackthornprod and Brackeys have the best unity video tutorials!
Next show us how to make a 2D street fighter type character plz. Button combos and hit boxes etc
Most of the comments : "Next time show how to make a fully fledged game ready to be sold" *facepalm*
Well technically did that already... Many times.
@@SuperMinecraft567 not really store-ready though, mostly prototypes
Something like "Can you make an MMO RPG Battle royale tutorial please?"
@@elektra81516 The tutorial video for a store-ready game is just going to be "Work on your game for potentially years in a repetitive cycle of feature implementation, getting feedback, and bug-fixing, until you run out of time or money."
CAN YOU MAKE A GAME LIKE BORDERLANDS 3 OR GTA 5 THANKS
You should elaborate on this to make a combo that initiates after pressing the attack button immediately after a previous attack finished
please make a video on inventory, money, or pick ups after death! That would be awesome!
The anime character 1 second after seeing enemy: 0:21
if its naruto then its -6 seconds before seeing them lol