Character Controller With Animations - Walk, Run, Jump & Attack - Unity 2020 - Beginner Tutorial

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments

looks awesome, I'll definitely follow the tutorial when I have time after the holidays

👍︎︎ 1 👤︎︎ u/II7_HUNTER_II7 📅︎︎ Dec 25 2020 🗫︎ replies
Captions
it's christmas morning but you got no gifts your parents didn't get you any you don't even have friends so no friends got your gift but don't worry i got your gift today i'm going to remake probably my most viewed video ever character controller with animations walk and attack quick and easy i realize this video is very outdated and also it's really so today we're gonna make it better quicker and better so grab a santa hat grab some cookies maybe some milk put on your white beard and let's get into it all right first i'll show you how this will look so you'll be able to uh rotate the camera which will actually rotate the character and then you'll be able to move forward and backward you can also hold shift to sprint and you can also attack at any point and you can already see this is much better than the previous edition we will be using the same aspect as in the previous edition tune rts units demo and you will get this cool character with four animations there's a link in the description to this so i'll just assume you know how to import assets into unity if you don't you need help also look out for the timestamps uh on the timeline and let's just delete everything that i have in here except my models so this is probably something you have i'm going to right click into in the hierarchy and i'm going to go through the object plane this is going to be our ground so let's just name it ground and let's go and set the position to 0 0 and 0 and also the scale to 1.5 1 and 1.5 next we need our player so just right click again and create empty this is going to be our player in the transform set the position to 0 0 0 rotation to 0 0 0 and scale to 1 1 and 1. next we're going to go into our toon rts folder go to models and you'll see this toon rts demo model and just drag it onto the player right here good now he's going to get centered right there and that's all you need next go to the player object and add a few components we're going to add a rigid body and we're going to set this kinematic to true this will just make it so we're not affected by physics but why are you using a rigid body then well i'm just using using it for optimization and what do you care this is tutorial just follow i'm kidding of course next we're going to add a character controller this is what we're going to use to control our character and i want you to in the scene you take a look at your uh capsule here so that's your character controller and we need to center it to the player so i'm going to send set the center to 1 or maybe 0.75 and set the height to 1.75 actually 1.5 will work much better make sure you got all that right and now we're going to create our first script so we're going to create a new folder for scripts and in there uh we're just going to create a c sharp script that i'm going to name player movement hell yeah okay open it up i'm using visual studio you can use anything you want it shouldn't matter too much okay so i'm just going to zoom in is this close enough for you guys are you blind enough for this is this good okay so i'm just going to delete these functions we're going to need some variables and we're going to need some references you don't have to do this this is just for me to keep my code clean we're going to say serialize field private float move speed and if you don't know what this means i'll explain in a sec we're going to create serialize field private float walk speed serialize field private float run speed i'm going to create a private vector 3. vector 3 is just a variable of three floats and this is going to be our move direction this is just the direction we're moving in and in our references we're going to need a private character controller controller this will be the reference to our character controller on our player object right here because that's what we're gonna use to move okay let me explain to you the serialized field right here so usually you would create a variable as either private which means the other script can't access it and also if i go ahead onto my player and drag the script to the player object you can see that we can see walk and run but we cannot see the move speed but they're all private well that's what serialized field does it basically makes it so you can see it in the editor but it keeps it private so you can see now when i made it serialize field we can see it in the inspector you can also you could also just set this to public right like that and we would still be able to see it in our inspector but this is just unnecessary since no other script is going to be accessing this variable right here so we're just going to go with serialize field private it keeps it private but we can see it in inspector okay so let's start with private void start good joke right so this is a unity function that gets called whenever the game starts and in here we're gonna say controller is equal to get component character controller so basically when we made this variable it was null so it was nothing it was empty and if we try to do anything with it we would get a error saying that this variable is not assigned properly or something like that but whenever we start the game we're going to say controller is equal to get component character controller okay all of these rigid body character controller and player movement all of them are components so basically what we do is we from this script we say well get the character controller component from this object so it goes is this the character controller no it goes next is this the character controller no is this the character controller yes and then it gets this variable or it gets this reference sorry with get component we go to the object of our script and we find the reference we're looking for should be pretty simple hopefully i explained that good and now we're gonna use private void update and this is called each frame okay to keep this clean i'm going to create a private void move so this will be our function for movement just to keep our update function clean because later if you're going to be expanding this you want to keep this clean and we're just going to call move each frame like that so we're calling this function each frame pretty simple okay now let's think what do we need well we want to move our character here the way we can do that is by recognizing when the player is pressing the w a s and d keys thankfully unity has something called a axis if you go to unity and go edit and then project settings and go to input manager open up this drop down menu and you can see all the access the unity has so horizontal is left and right we don't want that we're going to be rotating our character left and right and a vertical is up and down or w and s so we can actually use this in our script so what we're going to do is we're going to create a new float called move z because the z axis is the forward and backward axis and we're going to set it equal to input dot get axis and we're going to get axis vertical like this so basically all we're doing is we're going here and we're accessing our axes and what this does is whenever we play press w our move z is going to get set to one and whenever we press s it's going to get set to minus one so that's what we're trying to do here so now we have a way of telling what the player is pressing let's just apply it now so we can do now is uh just go to our move direction and this is the direction that we want to be moving at and we're going to set it equal to a new vector 3 a new value of vector 3. at on the x-axis which is left and right we want to move it for zero on the y-axis which is up and down we also want to move it for zero and on the z-axis we want to move it for the move z amount okay this is all very nice but what we want to do here is just say move direction is equal or times equals walk speed for example okay basically so when we when we uh move our character for example we press w so we want to move forward our move direction is going to get set to zero 0 and 1 but we don't want to move one unit per frame or per second even that's just too little so what we'll do is we'll multiply with walk speed so let's say our walk speed is 5 we're going to multiply zero zero one with five and that's equal to zero zero and five so we're actually moving five units this is what that does next i can just go to controller which is our character controller that move which is also a unity function that moves the character controller and we're in here we're going to feed it move direction because you can see it takes in a vector 3. so we'll give it move direction but we also want to make sure we multiply with time dot delta time time the delta time make sure that no matter how many frames we have we're still going to be moving the same amount so definitely use time dot delta time so let's just close our script right here make sure that the player movement script is on your player make sure that walk speed is set to something and we can set the run speed to something also so my walk speed is 5 and run speed is 7 and make sure move speed is 0. so you can see if we press w we actually move and with s we move backwards so that's what we wanted that's good let me try and show you something we have a small problem so our character is not actually on the ground you can see that he's actually kind of floating and there's a simple fix for that so we can go to our player go into our character controller and at skin width we're just going to drag it all the way down so we'll set it to the minimum value and now if we play you can see that he's no longer floating that's great okay but also we want to be able to run so let's implement that okay let's think what's running it's basically just moving at a higher speed so if you take a look here at move direction times equals walk speed if we just set it to times equals run speed we would move faster so let's try and do that let's delete this now we need to be able to tell when we're walking on when we're running so let's use a if statement basically if a condition is met we're going to run some code so if move direction is not equal to vector 3 dot zero okay so move directions of vector three and if it's not equal to vector three that's zero vector three that zero just means zero zero zero so if we're moving if our movement is not equal to 0 0 0 we want to do something that means we're walking so here let's just quickly comment it walk but we also want to check that we're not getting the left shift key so we can say n this means and so two conditions have to be met we're gonna say input dot get key key code that left shift or sir left shift like that this right here means that we're getting left shift so if you're pressing left shift but if we put a small exclamation mark here that means if we're not pressing left shift then we want to walk else if so if this is not true we're going to check this again we want to check if the move direction is not equal to vector 3.0 so if we're moving and this time we want to check if we're getting the left shift and here we're going to run okay this basically moves if this is not uh correct then we move here so if we're not moving and we're pressing left shift we want to run pretty simple also we want to know when we're idle so i'm just going to create else if move direction is equal to vector 3.0 so if there's no movement we're idle and here were idle again to keep this clean i'm going to create some new functions so go all the way to the bottom right here and we're going to create a private void idle we're going to create a private void walk and we're also going to create a private void run okay when we're idle we don't have to do anything yet but we will need this later when we walk we want to set our move speed equal to walk speed sorry walk speed like that and here we want to set our move speed equal to run speed let's make sure we're calling these functions so where we commented out walk in the first if statement let's just say walk in the second one let's just say run and in the third one let's just say idle like that when we're walking we're gonna set our move speed to walk speed that's why our move speed in our uh inspector is zero so move speed is more of a container than a variable so basically move speed is going to be equal to whatever speed we want to move at but to make sure we use it here after this these if statements we're going to say uh move direction times equals move speed okay so we're gonna check what we're doing this frame in these if statements we're gonna set move speed either to walk speed or run speed and then we're gonna multiply move direction with that wanted speed that's the best way i can explain it to you just for testing let's set our run speed to 20 just so we're sure when we're running and let's click play okay so this is us walking and this is our running so if i hold down a left shift you can see that we move much faster okay joke's over let's set our run speed to seven but if you take a look if i move my character or our player a bit up and start playing you can see that he just is kind of flying right now so we want to get rid of that we're going to be adding adding some gravity so move up to the top of the script we're going to need some new variables and references so i stole this idea from brad keys some of you might know this but it works amazing so what we're going to do is we're going to create a serialized field private boolean is grounded this is going to keep track of is the player on the ground or not we're also going to have a serialized field private float ground check distance and we're also going to have a serialized field private layer mask and we're going to call it ground mask don't worry i'll explain all of these later also under our move direction we're going to create a private vector 3 velocity we could just keep track of our up and down position in our move direction but it's much cleaner to separate them into two different vectors so velocity is gonna take care of our gravity or keep track of our gravity in jumping and we'll also need one more variable for gravity so private float gravity we're going to set all of these in the inspector and let's get to the code first we want to know if we're grounded because we don't want to be applying gravity for grounded and we also don't want to be jumping if we're not grounded we're going to set is grounded equal to physics dot check sphere and you can see we need to give it a position which is going to be our transform that position and we need the right radius which is our ground check distance and we also need a layer mask and we're going to set that to our ground mask okay you might not be getting what's happening here let me explain our transform position is the position of our player so our transform is this and the position well it's this and you can see in the uh in the scene view that that is at our feet it's at the bottom of the player and this is where we'll be checking if we're grounded our ground check distance is the radius of our sphere so it's the it's the size of the ground check and our ground mask is a layer that we're going to check for if we're grounded basically what that means is our ground is going to be on a separate layer here and that will get rid of some problems for us so for example if we step on something that is not the ground we're going to start falling or we're not going to be able to jump in czech sphere it basically just draws a sphere at a position with the radius and filters out the layer so basically what this is going to do is it's going to draw a small sphere at the bottom of her feet that's going to check if we're standing on a layer of ground and layer is just an object here so it's basically going to check if we're standing on on the ground object so this function is going to return true whenever we're standing on ground and it's going to return false whenever we're not we're going to check if is grounded and velocity dot y is less than zero and we're gonna then set velocity equal to minus two or sorry velocity dot y i'll explain what this does later so move at the bottom of our move function down here after our controller that move for move direction and we're gonna say velocity dot y plus equals gravity times time dot delta time so here we're just gonna apply gravity to our character with time dot delta time and we're going to say controller dot move and we're going to move on our velocity here and we're also going to say time dot delta time because that's the equation for gravity you have to multiply twice with time delta time okay so here we're going to calculate our gravity and here we're going to apply gravity to our character that's what's happening and this function up here basically checks if we're grounded and if we are grounded we want to stop applying gravity so we're just going to set velocity.y to minus 2 because if we just set it to 0 it might not ground us fully so we're just setting it to a small negative value and it should work fine so basically this just stops applying gravity whenever we're grounded and also we don't want to be moving unless we're grounded so what i'm going to do is come here and above our if statements i'm going to create another if statement so i'm going to say if is grounded so if we're grounded we're going to just take all of these if statements and run them so if we're not grounded we're not going to check if we're walking running or idling because we don't want to be able to run while we're falling or something or walk while we're falling so basically we need to check if we're grounded and also our move direction times equals move speed we're also going to move that inside our if statement right here because we don't want to be multiplying our forward and backwards because of the same reason as this we don't want to be moving while we're falling jumping or something else so now if we go into the editor and set our ground check distance to maybe something like 0.2 or ground mask to ground and if you don't have that you can go ahead to your ground uh object go to layer add layer i add in here ground and then go back to ground and apply the layer so make sure your ground mask here is same as the ground object that did not make sense but you get it and we're going to set our gravity to minus 0.81 because that's uh like real gravity real life gravity if we play now you can see we fall and now we can move forward and backward we can also run but we cannot jump so let's add that so we're going to create a new private void uh jump this is just uh below our idle walk and run functions i just collapsed them here so they're not in the way if we want to jump we're gonna need a new variable for serialized field private void jump height or sorry not void float god damn it so private flow jump height and down here at the bottom below our run void we're going to create a private void jump so calculating jumping actually use the equation which we're going to use here but i'm just not going to go and explain it because i'm not going to explain those sort of things so just velocity.y is equal to math f that square root which is basically going to give us the square root of what we give it here and we're going to give it jump height times minus 2 times gravity so it's going to take all of this and it's going to get the square root of that and that's the amount we're going to jump so when do we want to call our jump so up here in our if is grounded so we definitely want to be as grounded if we're jumping so below uh our multiply with move speed i'm gonna create a new if statement saying if input dot get key down so if you press a key key code dot space so if you press down space we want to jump so we're just gonna call jump okay now save that go into unity and we should be able to jump if we set our jump height to something like 0.5 maybe or sorry 1.5 and we can jump and you can see looks pretty good we can move and jump also amazing we're pretty much done with our player movement for now so we want to create some kind of a camera controller let's just go ahead and set our player's position on the y-axis to zero and now is the time to uh set up your camera so take your camera and drag it to the player because now if we move the player our camera is going to move with it and it's going to follow our player that's why we're parenting it down here so just take the camera and drag it in here and now you can play around with the with the position on the y and the z axis my position on the x axis is 0 on the y axis is 2.15 and on the z axis is minus 3 and i also set my rotation on the x axis to 15. so i get this cool view of my character if you play now you can see that the camera will follow our player but we still have no way of rotating our player so let's create a new script that we're gonna care uh call camera controller let's open it up this one this one is actually pretty short and simple so we're gonna need some variables and some references again you don't have to do this this is just to keep my code clean so we're gonna need a serialized field private float for mouse sen city vt that's right i spelled it right and we're also going to need a reference to our parent object or our our player so we're going to create a private transform parent apparent object is the higher object in the hierarchy in this case a parent of our main camera is the player that's why we want it so in our private void start we're going to say parent is equal to transform that parent basically what we do is we go to our camera and we say well the parent of this object is the object we want to rotate so we just assign it this object right here hopefully that makes sense again we're going to create a private void update and to keep it clean once again we're going to create a private void rotate and we're going to call this function in our update or each frame so just make sure it looks like that here we're going to do something similar as in player movement except we're not going to be getting input from any keys we're going to be getting input from our mouse so we're going to get float move or sorry not move mouse x is going to be equal to input dot get axis mouse x we also want to multiply mouse sensitivity and time dot delta time so this returns the value of us moving our mouse left and right so if you actually go back to our input manager and edit project settings input manager you can see that we have mouse x and it will return a value depending on how much we move our mouse left and right so that's what we're using here we're multiplying it with our mouse sensitivity that we're going to set in our inspector and time the delta time just to make sure that it works perfectly no matter the amount of frames and then what we're going to do is say parent or our player that's basically it rotate and we're going to rotate it for a vector 3 up on on a vector 3 up axis so if you take a look if you try and rotate your character uh we want to rotate him left and right and that's rotating him on the y-axis you can see a change here and that's actually our up axis right here so the green one is y and we want to rotate around that axis so we're going to say vector3.up and we're going to rotate uh on our mouse x amount and that's it for the camera controller if you go back into unity we'll save and go back go to your camera and drag the camera controller set the mouse sensitivity to something stupid like 250 click play and you can rotate your character i've fallen and i can't get up now just a little luxury tip here so you can see that our mouse actually moves quite a lot around and i want to fix that so i'm going to go to my camera controller and in the start method i'm going to say cursor the lock state is equal to cursor lock mode locked that's a lot of else for you there basically what this is going to do whenever we start the game it's going to lock our mouse to the middle of the screen so we don't have to look at it jump around like crazy goose or something so you can see now we have our mouse centered and if you want to see it again just press escape and you can see it again but we have another problem so you can see if we move forward i'm pressing w right now i'm actually moving backwards that's because we're moving on the world axis so if we're moving on the world axis our forward is always going to be that direction no matter uh where i look at so i can look left and press w and i will move in the same direction there's a simple way to fix this so if we go back to our player movement and up here where we set move direction to a new vector 3 i'm going to say move direction is equal to transform with a small t or a tiny t i like to call it dot transform direction and we're gonna transform move direction this is basically gonna make it so our forward is not log is no longer this forward or just this forward it's gonna start using our players forward so if we rotate our player there you can see that his forward is now there so if i rotate it again his forward is now there so we're basically going to start using this instead of using the global ones which no matter where i rotate him is always in in the same direction so if i click play now you can see that i can rotate and move in whichever direction i want and that's what i want i can jump that's looking pretty good now we just need to add some animations and hopefully this will be quick and easy okay you can find the animations in our toon rts demo animations and we have four animations we have charge which we're gonna use use for uh sprinting or running we have our idle we have walk and we have attack we're gonna use all of these all right so the animations are already set up for you so you don't have to do anything around that what we do have to do is go to our assets and create a animator controller that i'm gonna call player animator animator and this is what we're gonna use to trigger our animations or to play our animations so you can go to our toon rts demo night under our player and you can see that he has a animator component on it and it needs a controller we just created that so we're just going to drag it into there now we can control its animations so if we open that up and let me just make this a lot bigger for you so you guys can see it a bit better like that and we have no animations currently just to show showcase you this you can take your idle animation and just drag it in there and it's going to be uh orange which means it's going to play whenever we start the game and now if i play the game you can see that we start playing our idle animation but when we walk nothing happens so that's what we're gonna be fixing right now let's delete our idle animation let's right click create from new blend tree blend trees i think it's pretty self-explanatory it's going to take a few animations and it's going to blend them together depending on a value so up here i'm just going to rename this to movement and i'm going to double click it and you can see i have this node right here and i'm going to click the plus sign here three times the first one is going to be our idle animation the second one is going to be our walk and the third one is going to be our charge in the left top corner you can check or you can click parameters and you'll see this blend this is also the same blend we're using here so just to show how this works you can drag this thing up here just to see how it looks you can click play here and it will play the current animation which is idle and depending on uh this valley right here it's going to play different animations so at 0.5 it's going to play our walk and at 1 it's going to run so you can see we can smoothly transition through all of them so i'm just going to go up here to my parameters and i'm going to rename blend to speed and now we can use this value to control our animations go back to our script in player movement and now up here in our references i'm gonna need a private animator and i'm gonna call him anim in our start function we're going to say anim is equal to get component in children not get components in children but get component in children and we're going to get animator so let me just explain this to you so we're going to set our animator to be equal to our player animator because our script is going to go into children and it's going to go into the first child here and it's going to be like i need the animator and it's going to check right here can i find the animator and then it will find the animator if we just called get component it would return null because our player object doesn't have a animator but our model does so basically that's what happens we're gonna go all the way down to our idle walk and run and in here we're gonna set the animations so when we're idle we're gonna go anim dot set float and then in here we're gonna give it the speed float and we're gonna set it to zero in our walk animation we're gonna go anim that's set float we're gonna set float speed to 0.5 make sure you press f or put f after you use a decimal number and in a run we're gonna go ending that set float to speed or speed to one okay so whenever we're idle we're gonna set speed to zero whenever we're walking we're going to set speed to 0.5 and whenever we run we're going to set speed to 1. that's what i demonstrated to you right before that so at zero at 0 we're idling at 0.5 we're walking and at one we're running okay so let's get into our game and check how that looks so if we start walking and plays the walk animations if we start running it starts the run animation but you can see it's very kind of sharp and uh very sudden and it's not very pleasant to look at so it just kind of snaps to that luckily unity made it easy for us to make transition let's go to our run for example so we set our speed to one but if we put another semicolon i think that's what it's called you can see that it gives us damp time and delta time this we can use to smooth out the animation so for damp time i'm going to say 1.15 or maybe 0.1 0.1 and for time that for delta time we're going to give it time dot delta time so it's basically just going to smooth it out really quick so it's not so abrupt we can do the same thing in our other functions so just go here and i'm gonna copy paste this so everywhere we're just gonna say 0.1 and time that delta time this will make sure it's smooth and everything okay for play now you can see if we start moving it's going to start very smoothly and if you start running it's also going to be very smooth if we stop it's going to stop not so sudden but very smoothly so you can see that it's looking very nice right now the only thing left is to add the attack okay let's go back to our base layer and the way we can add attack is just by taking our attack animation dragging it in here right clicking on our movement make transition make one to the attack and make the other one back that kind of rhyme that's cool so the one going to the attack animations you can click that one and check off has exit time this will make sure that this animation gets played immediately and it doesn't have to wait for the previous animation to finish and you can see we need the condition here so i'm just going to go to my parameters click this plus and create a trigger called attack in our conditions on our uh transition we're gonna give it attack so whenever we trigger this and a trigger basically gets triggered and then it's set off so it just gets called once if we go back to our player movement i'm gonna create a new function private void attack and i'm gonna just go nm that set trigger attack so this is just going to set our trigger real quick and in our update function i'm going to check if input.getkeydown keycode.mouse0 so if we press our left click i'm just going to call attack and we're checking that in the update method of course so if you press down save that and go into unity and let's see how this looks and you can see if we left click it attacks but if we're walking and left click you can see that our legs kind of just float there or slide and that's what we want to stop thankfully unity saves us again and this is very easy so there is something called a uh avatar mask and you can see that uh on our tune rts demo night we're using a tuna rts demo knight avatar and this is basically a skeleton of or a rig of our character so we can do is mask it for example so our attack animation only affects our upper body so you can right click into the project view create and down here avatar mask and i'm going to call it player attack mask if you open it you can see that we have humanoid and we have transform our avatar is not humanoid it's generic so we're going to be using transform and we need to give it a skeleton and we're going to use our toon rts demo knight and we're going to say import skeleton and it's going to import everything you can see we have a few bones here so now we want to tell it with which bones to affect i'm going to toggle all i'm going to find my spine so open up the bip001 then bib001 pelvis and then go to bip001 spine and we want to affect it all of this so just these four check marks and you'll have to open this till the end and make sure that everything in between is also check so we want to if you open it fully we want to check everything from bip001 spine to bip001r hand so just i'll just give you a few seconds to copy this this basically means our animator is gonna or this basically means that this mask is gonna only affect our upper body so let's use this go back to our animator go to layers add a new layer this is going to be our attack layer and if you click this little cog wheel you can give it a mask so we're going to give it our player attack mask so basically everything on this layer is only going to affect our upper body so let's go back to our base layer delete our attack animation go to attack layer find our attack drag it in there into our attack layer and we don't want it to be default because then it's going to play each time we start the game so right click create state empty and i'm just going to name it empty right click on entry set state machine default and set it to empty and now we'll basically repeat the steps from before and just make the transitions go to the left one uncheck has exit time go to conditions and set the attack condition if we play now you can see that we cannot attack that's because our animator layer uses a weight so if we set the weight to one and try playing now you can see that we can attack but for example when we sprint our arms don't really move the the same way they did before so what we want to do is just make sure we check that in the script a very simple way to do this is using a i enumerator and i'll explain what this does or actually i'll show you so basically we're going to set our trigger attack but before that we're gonna go anim dot set layer weight and then which layer do we want to affect well basically we're gonna go anim dot get layer index and we're gonna get the layer index of our attack layer and we're gonna set it to one so basically we're gonna set the weight of our attack layer to one and then what we can do because we're using a i enumerator we can go yield return new wait for seconds you don't have to know what this means all you have to know is that here it's gonna wait for a certain amount of seconds and i'm going to give it 0.9 seconds so it's going to wait for almost a full second before doing something else so i'm just going to copy this up here and paste it down here and we're gonna set it to zero so basically when we attack we're gonna set our attack layer weight to one or we're gonna show it we're gonna play our animation we're gonna wait for 0.9 seconds and then we're going to set the layer weight to zero so we're going to disable the layer again to call this properly you'll go back to the update function and instead of doing this you'll have to go start co routine and then just give it attack right there like that now if you play you can see that we can attack we can also run and it's gonna play our run animation fully now usually what i would do is i would add some kind of a cool down for the attack because now you can spam it and it's going to break the character but if you want me to expand onto the script leave a like this is the end of the video we basically made everything we wanted and hopefully you guys enjoyed this hopefully you learned something new if you haven't wait for the next christmas i'll give you another gift you can go follow me on my patreon that will be very appreciated and go join the discord server and that's pretty much it thank you so much for watching and i'll see you in the next video bye bye guys [Music] you
Info
Channel: Single Sapling Games
Views: 87,941
Rating: 4.9144826 out of 5
Keywords: script, make, game, for, free, development, dev, unity, blender, program, tutorial, guide, new, hd, twitter, youtube, developer, indie, design, art, cool, easy, quick, fast, 2019, fps, first, person, shooter, gaming, how, to, intro, introduction, learn, teach, learning, teaching, devlog, live, stream, livestream, unity3d, unity2019, blender3d, indiegamedev, indiegame, indiegamedevelopment, 2020, scripts, character, controller, movement, move, run, walk, sprint, jump, gravity, animation, beginner, simple, animating, asset, store, assets, model, 101, animator, mask
Id: qc0xU2Ph86Q
Channel Id: undefined
Length: 49min 2sec (2942 seconds)
Published: Fri Dec 25 2020
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.