Juiced Up First Person Character Controller Tutorial - Godot 3D FPS

In this video we create a first person character controller for Godot 4 from scratch. We also add a range of game feel features including headbob, sprinting, fov change, and inertia. This controller can be used for a variety of Godot 3D first person games, including FPS, horror, survival, RPG, etc. All of this code works with Godot 4.1.
Support the channel: / legiongames
The full project is available on github: github.com/LegionGames/FirstP...
Godot 3D transforms explained: docs.godotengine.org/en/4.0/t...
Wishlist Game: store.steampowered.com/app/21...
Discord: / discord
Itch: legiongames.itch.io/
Twitter: / legiongames1
Instagram: / legiongames1

Пікірлер: 615

  • @legiongames2400
    @legiongames2400 Жыл бұрын

    As badunius pointed out, a capsule shape is better for collision because it is a simpler shape. When you're creating a collision shape make sure to use that. This has been updated on github. Also make sure to turn on collisions for any CSG boxes you add or you will fall through the floor.

  • @tftc97

    @tftc97

    10 ай бұрын

    where do i do that???????????????????????????? edit: nvm

  • @kinggreen9073

    @kinggreen9073

    9 ай бұрын

    I said the same thing bro@@tftc97

  • @Kirico_gd

    @Kirico_gd

    9 ай бұрын

    hey do you still reply under older videos, if yes do you know why my camera moves on both x and y axis when i load the game

  • @sourlesscream1272

    @sourlesscream1272

    8 ай бұрын

    @@Kirico_gd Head pivot is for horizontal rotation and Camera is for vertical the camera portion of the script should look like this head.rotate_y(-event.relative.x * SENSITIVITY) camera.rotate_x(-event.relative.y * SENSITIVITY) camera.rotation.x = clamp(camera.rotation.x, deg_to_rad(-45), deg_to_rad(45))

  • @dynstinn

    @dynstinn

    8 ай бұрын

    can you add crouching please, i need this character controller for a horror game im making, i REALLY need crouching

  • @spacejamzyt6461
    @spacejamzyt64613 ай бұрын

    If anyone is having issues and falling through the floor you might need to go into the CSGBox and turn on "Use Collision" in the Inspector panel on the right hand side. You might also need to setup Collision Layers and Collision Masks, this is also in the Inspector Panel. On the CSGBox turn on Collision Layer 2 and Collision Mask 1. For your CharacterBody3D turn on Collision Layer 1 and Collision Mask 2.

  • @DD-cv1ro

    @DD-cv1ro

    3 ай бұрын

    thanks !

  • @TheCodeOfMaia

    @TheCodeOfMaia

    3 ай бұрын

    Holy shit thank you

  • @RufusHammond

    @RufusHammond

    2 ай бұрын

    Thank you!

  • @Powerz559_CyberCoder

    @Powerz559_CyberCoder

    2 ай бұрын

    Couldnt thank you more.

  • @shakiraleathen8524

    @shakiraleathen8524

    2 ай бұрын

    Thank you, you're a lifesaver 🙏. I thought I had done something wrong 😅.

  • @badunius_code
    @badunius_code Жыл бұрын

    0:45 technically capsule collision shape gotta be better for perfomance, because you have to solve just one primitive collision, whereas a convex hull is solved on per face basis.

  • @legiongames2400

    @legiongames2400

    Жыл бұрын

    Oh yeah that actually makes sense.

  • @deadturret4049

    @deadturret4049

    8 ай бұрын

    way better for performance. You could argue that the capsule is calculating 3 shapes, (2 spheres, 1 cylinder), but the calculations to do those is ludicrously simple and fast. Switching to face collisions is not great.

  • @Spuds1411

    @Spuds1411

    3 ай бұрын

    I've always just used a cylinder for character collisions! I've found its the simplest possible shape which also gives the best results for collisions!

  • @pixels_per_minute
    @pixels_per_minute2 ай бұрын

    One of the best First Person tutorials I've ever found for Godot. A LOT of other videos seem to throw out the sample code for far more complex code that just dose the same basic stuff in a different way. I like how you just build off it instead, and provided us with a simple, yet highly configurable base. I also learned a few tricks I can apply in my 2.5D character controller since it also uses the same sample code. From here, I'll be looking to add in a raycast system in order to see what the player is looking at and maybe a menu system, which I now know how to do thanks to people like you!

  • @legiongames2400

    @legiongames2400

    2 ай бұрын

    Thank you friend! :) I'm really glad I get to help out

  • @yusarimahubara
    @yusarimahubara8 ай бұрын

    The best simple head bob I could found in the internet, the other ones are overcomplicated and they didn't seem so nice, great job!

  • @legiongames2400

    @legiongames2400

    7 ай бұрын

    Thank you! :)

  • @DePistolero

    @DePistolero

    4 ай бұрын

    YES, elegant, simple, tweakable, straightforward and bulletproof... Just starting godot( turnover from Unity ) more than 7 yrs of xp...

  • @Papajoofable

    @Papajoofable

    6 күн бұрын

    ​@@legiongames2400Hey man! Cool vid, i really like that headbob. But, how can i make footsteps sounds with it? (I hate animation player and blend tree headbobbing)

  • @menacingskull740

    @menacingskull740

    Күн бұрын

    THE POWER OF ACTUALLY USING MATH AND ACTUAL FUNCTIONS IN GODOT

  • @wolcamophone4783
    @wolcamophone478311 ай бұрын

    I find it easier to pull better snippets of code and explanations from random tutorial vids than to watch tutorials on specific subjects as some tutorials will mislead you from what you want to actually accomplish in your code.

  • @dapperwolf465

    @dapperwolf465

    8 ай бұрын

    Wait

  • @dapperwolf465

    @dapperwolf465

    8 ай бұрын

    HOLD ON YOU GAVE ME A IDEA!

  • @spinnysponk778

    @spinnysponk778

    8 ай бұрын

    @@dapperwolf465what js ur idea

  • @bamb00zld

    @bamb00zld

    7 ай бұрын

    Says the intermediate programmer who probably knew Python before learning Godot.

  • @steviewonderisnotblind5833

    @steviewonderisnotblind5833

    2 ай бұрын

    @@bamb00zld flexing your credentials on a tutorial video is pretty embarrassing

  • @BurritoByte
    @BurritoByte6 ай бұрын

    Hello LegionGames! I wanted to thank you for creating this video. I recently wrapped up my Godot 4 FPS prototype and this video played a monumental role in getting the initial player controller implemented and working for my project. I just published my video of it on my page and have added you in the game's credits as a thank you for this tutorial video. Thanks so much again and looking forward to future uploads!

  • @legiongames2400

    @legiongames2400

    6 ай бұрын

    Thank you friend! :) I'm really glad it helped you out!

  • @MizziePeasy
    @MizziePeasyАй бұрын

    I am starting now on the game dev world and this was the first video I found that didn't bore me to death! Straight to the point and great humour! I was planning on doing a single player arena shooter and you have the perfect video. Thank you so so much, I really hope you have lot of success in your life ☺

  • @stevedowning3892
    @stevedowning38928 ай бұрын

    Absolutely wonderful tutorial, thanks so much. I am a rank n00b to game dev in general, having downloaded Godot last week. I found it super instructive to type the script along with the video, but to use the Git download to help with fault-finding, when I inevitably made mistakes.

  • @Marcusvlogs
    @Marcusvlogs29 күн бұрын

    Really good tutorial. I like that it was fast and informative but didnt get bogged down into every little gritty detail

  • @Dawid30303
    @Dawid303038 ай бұрын

    great tutorial, thanks a lot. To anyone new to godot, if you are confused about what a function is doing, then i recommend printing out the variable the function is modifying. This helped me understand a few things a bit better

  • @legiongames2400

    @legiongames2400

    8 ай бұрын

    That's a great idea even if you're not new to godot haha, thank you for watching!

  • @indieology7336
    @indieology7336 Жыл бұрын

    This is awesome! Thank you for your great work!

  • @legiongames2400

    @legiongames2400

    Жыл бұрын

    Thank you! :)

  • @Redemtor1
    @Redemtor18 ай бұрын

    straight forward video with a snappy sense of humor. love it

  • @_phloggy_
    @_phloggy_8 ай бұрын

    amazing vid, i've understood pretty much everything you've taught me, thank you!

  • @m0nste_
    @m0nste_3 ай бұрын

    Thank you so much for this tutorial. I've never really gotten into coding before, so I'm attempting to learn Godot to get into the swing of things. I would love to see another video perhaps diving into crouching implementation as well as crouch sliding! :)

  • @LaurenNapier-uk4yk
    @LaurenNapier-uk4yk3 ай бұрын

    This was exactly what I needed while I'm learning, thank you! Now for that extra juice I gotta find some way to add a little acceleration and hopefully a faster initial jump speed like source games...

  • @t3st3d
    @t3st3d8 ай бұрын

    thanks! i just switched from unity to godot and this is the most helpfull tutorial i have found so far

  • @legiongames2400

    @legiongames2400

    8 ай бұрын

    Hey welcome to the engine haha, I'm glad you're enjoying my videos

  • @badunius_code
    @badunius_code Жыл бұрын

    5:15 or even better, you can rotate your entire body along the Y axis and not just your head. Shadows will give you away if you'll switch to a non symmetrical body.

  • @legiongames2400

    @legiongames2400

    Жыл бұрын

    Very good point.

  • @Jacklo-the-catsect

    @Jacklo-the-catsect

    11 ай бұрын

    thank you for this, until I rotated the head, the body didn't rotate, and so I looked backwards then walked forwards, I'd be going backwards, but rotating the body fixed that.

  • @SuitedGhost

    @SuitedGhost

    9 ай бұрын

    ​@@Jacklo-the-catsect well thats cause you multiplied the direction by the forward vector of your actual player, not your head (not trying to justify using the head, just sayin)

  • @cassis2325

    @cassis2325

    9 ай бұрын

    This fix is also better in the way that now your starting rotation of the body doesn't have to be zero in the engine. Now you can rotate the entire body to your hearts content in the engine without it messing up local an worldposition's whilst walking

  • @mattg6550

    @mattg6550

    8 ай бұрын

    Just for anyone running into trouble here, you will be replacing head.rotate_y(-event.relative.x * SENSITIVITY) with rotate_y(-event.relative.x * SENSITIVITY) to accomplish this, since if we rotate_y (or do any translations or rotations without specifying what we are translating or rotating) we will enact this on the 'scene' that the script is attached to, in this case the root "Player"

  • @sonicfan826
    @sonicfan8267 ай бұрын

    This really helped me out, thank you for the tutorial and have a nice day

  • @legiongames2400

    @legiongames2400

    7 ай бұрын

    Thank you for watching friend! :)

  • @monopoly2170
    @monopoly217010 ай бұрын

    Great job! I would recommend using similar lerp functions to add acceleration/deceleration

  • @tje.o.a5477
    @tje.o.a54772 ай бұрын

    Thank you my dude, this has helped me remake my character controller after I switched to fps!

  • @legiongames2400

    @legiongames2400

    2 ай бұрын

    Thank you, I'm glad you enjoyed! :)

  • @Paulik76910
    @Paulik769109 ай бұрын

    Thanks for such a detailed tutorial.

  • @legiongames2400

    @legiongames2400

    7 ай бұрын

    Glad you liked it

  • @TheMisterNebo
    @TheMisterNebo9 ай бұрын

    Your content is great, you have a good pace (I like the 'faster' pace that you use), and Godot will be all the hype soon enough thanks to Unity's foolery. I subscribed, thank you so much for taking your valuable time to make this content for us. You make learning Godot fun!

  • @legiongames2400

    @legiongames2400

    7 ай бұрын

    Thank you very much! :)

  • @StrawberryBongo
    @StrawberryBongo9 ай бұрын

    thanks so much bro this is such a huge help!

  • @thricemindblown7883
    @thricemindblown78837 ай бұрын

    My favourite was the headbob function. That "->" should come in handy.

  • @chomiyeons
    @chomiyeons2 ай бұрын

    this was honestly kind of fast , but very informational and easy to follow:,)

  • @jasonleeroberts
    @jasonleerobertsАй бұрын

    this was amazing. incredibly fast, and concise. thank you! for any new game devs like me who couldn't figure out the collision at the beginning of the video: Just click CSGBox3D, and in the CSGShape3D menu on the right, click the checkbox next to "Use Collision". Make sure to do this for the other boxes you make for the level too. You can CTRL+click all the boxes you want to add collision to and add it to all of them at once.

  • @cyclonebee2205
    @cyclonebee22059 ай бұрын

    Amazing tutorial! Learned a lot about gd script from this.

  • @legiongames2400

    @legiongames2400

    7 ай бұрын

    Thank you! :)

  • @joefigura6132
    @joefigura61328 ай бұрын

    Great video, succinct and helpful

  • @DarkestMirrored
    @DarkestMirrored3 ай бұрын

    this seems very useful! the one thing i'd REALLY like to see would be stair handling? none of the player controller tutorials seem to care about being able to use stairs.

  • @legiongames2400

    @legiongames2400

    3 ай бұрын

    Yeah stairs are a little more difficult tbh, I would love to make a more complete controller one day, but there's a really well-made video that describes the concept in general concepts: kzread.info/dash/bejne/e4CKt8WYqbmYZMo.htmlsi=rZX2XExOCMyssIs3

  • @TheMikeMassengale
    @TheMikeMassengale6 күн бұрын

    Great stuff keep it up!

  • @Harald723
    @Harald723 Жыл бұрын

    Great toutorial the code works perfectly and i can almost understand it!

  • @legiongames2400

    @legiongames2400

    Жыл бұрын

    Thank you friend! Hopefully I can do better next time so you understand it all.

  • @Harald723

    @Harald723

    Жыл бұрын

    @@legiongames2400 well im a beginner so I dont realy know how to code that much!

  • @captainnelson9833
    @captainnelson98337 ай бұрын

    This is the best tutorial for a FPS character controller. Your code is just too clean for human eyes.

  • @legiongames2400

    @legiongames2400

    7 ай бұрын

    Thank you friend! :)

  • @arrtemfly
    @arrtemfly Жыл бұрын

    oh this *was* very helpful and fun. thanks!

  • @legiongames2400

    @legiongames2400

    Жыл бұрын

    Thank you! :)

  • @abhatem
    @abhatem9 ай бұрын

    Great tutorial, thank you!

  • @legiongames2400

    @legiongames2400

    7 ай бұрын

    Glad you enjoyed it!

  • @davidmarinho2848
    @davidmarinho284810 ай бұрын

    Great tutorial!!! 👏👏

  • @6lua
    @6lua2 ай бұрын

    Thank you so much! You helped me so much. Subscribed on you and liked the video.

  • @TupyBro

    @TupyBro

    Ай бұрын

    ооо, неожидал тебя тут увидеть, я делаю свою игру а тут ты в коментах

  • @6lua

    @6lua

    Ай бұрын

    @@TupyBro заебал

  • @TheValkire
    @TheValkire6 ай бұрын

    It would be amazing if you could do crouching and sliding based on current velocity (so you can slide down a slope).I've been trying to wrap my head around it for some days now without success... Great tutorial by the way!

  • @legiongames2400

    @legiongames2400

    6 ай бұрын

    Cool idea! And thank you for watching! :)

  • @ColdBlueLight
    @ColdBlueLight5 ай бұрын

    thank you sir i was able to create a juiced up first person controller! and mod it to my likeing!

  • @supposedly2478
    @supposedly247823 күн бұрын

    very helpful thank you very much

  • @RandomGuyyy
    @RandomGuyyy11 ай бұрын

    This video and the following in this zombie fps series are a good introduction to 3D in Godot 4.

  • @legiongames2400

    @legiongames2400

    11 ай бұрын

    Haha thank you! :)

  • @RandomGuyyy

    @RandomGuyyy

    11 ай бұрын

    @@legiongames2400 proper shooter tutorials with actual animated characters are thin on the ground for Godot so I hope the.algorithm catches wind of it.

  • @M_SWasUnavailable
    @M_SWasUnavailable11 ай бұрын

    you can include camera tilt when moving in a direction it looks really cool in part 2 ,can add sound effects for jumping,landing, running, add particles and crouch/sliding hehe ik its too much but would love to see that

  • @legiongames2400

    @legiongames2400

    11 ай бұрын

    Yeah all of these would be really important for most games!

  • @M_SWasUnavailable

    @M_SWasUnavailable

    11 ай бұрын

    @@legiongames2400 is this a taunt or you are serious? 😂

  • @legiongames2400

    @legiongames2400

    11 ай бұрын

    @@M_SWasUnavailable LMAO my bad if that sounded sarcastic. No, I'm serious, sound effects are a little tricky here so would be cool to do a vid on that. Plus extra camera movement like a little drop when you land, tilt on strafe, etc would make it even more juicy.

  • @M_SWasUnavailable

    @M_SWasUnavailable

    11 ай бұрын

    @@legiongames2400 haha its fine

  • @px8

    @px8

    11 ай бұрын

    @@legiongames2400 you should do this!! pleaase!

  • @johnc7389
    @johnc73897 ай бұрын

    Tremendously helpful.

  • @ryan_isacow21
    @ryan_isacow212 ай бұрын

    Thanks a little fast but help understand how godots code works

  • @Dragon20C
    @Dragon20C Жыл бұрын

    Looks very cool!

  • @Jacklo-the-catsect
    @Jacklo-the-catsect11 ай бұрын

    this helped thank you, although I would suggest 0.007 as the sensitivity, as it's much slower, but still fast enough, it also doesn't make you feel like you're on a rollercoaster.

  • @legiongames2400

    @legiongames2400

    11 ай бұрын

    Yeah people tell me my mouse sensitivity is too high all the time tbh. :D

  • @SuitedGhost

    @SuitedGhost

    6 ай бұрын

    i just multiplied it by the process delta time ._.

  • @LexGear
    @LexGear5 ай бұрын

    One thing I noticed is that there was a blurr on the edges of ojects when rotating the camera, this is because the rotation is calculated on the physics layer intbeween frames when it should be calculated on the frame layer _process().

  • @Hugo-xr1mg
    @Hugo-xr1mg7 ай бұрын

    this was pretty entertaining to watch, although i have a pretty silly question, your Rs are giving a W sound, is that normal? I'm curious

  • @Andruck
    @Andruck4 ай бұрын

    Thanks bro, are the best :D

  • @MerrStudio
    @MerrStudio4 ай бұрын

    One thing that's easy to miss cause the effect is subtle but if you have no velocity you don't reset t_bob value so your camera could be shifted ever so slightly from the bob when not moving anymore.

  • @DonGeorgesTheThird
    @DonGeorgesTheThird7 ай бұрын

    Really great video! Small question though, any chance you can make a follow-up video showing how to handle a controller for motion? I mean, the direction is pretty straight forward as it is a simple mapping of the (in my case) left joystick to the created action (not to mention the jump and sprint buttons) but the camera adjustments are kind of tricky as the game listens to mouse move events (as an input) and for the joystick, it feels like the modification should happen in the _process or _physics_process code rather than from the event itself.

  • @DonGeorgesTheThird

    @DonGeorgesTheThird

    7 ай бұрын

    Right, after a tiny bit of fiddling, I found it out. Sharing cause it might be useful for someone. The first thing I did was to export the 3 lines handling the rotation in the _unhandled_input function to a dedicated function _handle_rotation taking x, y and sensitivity as parameters. I make sure to pass the final values of x and y (i.e. -event.relative.x). I pass the sensitivity as I want to have a different sensitivity for mouse move and joystick. So I created the input for the right joystick (look_up, look_down, look_left, look_right) and in the _physics_process, I get the values the same way I get them for the movement (Input.get_vector). If the return value is not Vector2.ZERO, I call the _handle_rotation function. Done.

  • @LexGear
    @LexGear5 ай бұрын

    Super helpful.

  • @BlueCodingStudio
    @BlueCodingStudio8 ай бұрын

    Very useful, I am too lazy to write my own code, so hippity hoppity your code is now my property.

  • @legiongames2400

    @legiongames2400

    8 ай бұрын

    Wouldn't want it any other way, hope you're enjoying Godot haha

  • @TheRemaindersYT
    @TheRemaindersYT2 ай бұрын

    This guy needs more credit!

  • @InHUM44n
    @InHUM44n8 ай бұрын

    For anyone wanting to untie player movement from physics tickrate: For me moving move_and_slide() to _process(delta) instead of _physics_process(delta) fixed the "laggy" 60fps camera translation movement. Now my physics framerate is 30 to save performance on the CPU and it still feels good :)

  • @kabebu_

    @kabebu_

    7 ай бұрын

    I've been searching for the cause of those "lag spikes" for 2 days... Thank you :')

  • @annoyingkittycat6449

    @annoyingkittycat6449

    5 ай бұрын

    I've heard if a big lag spike hits it can completely mess up your physics engine if you do this from another youtuber, but I'm not sure if its true

  • @ryzenslt8943
    @ryzenslt8943 Жыл бұрын

    Omg thanks so musch all the tutorials Are so old and war

  • @legiongames2400

    @legiongames2400

    Жыл бұрын

    Thank you for watching!

  • @OmniWareTeam
    @OmniWareTeam22 күн бұрын

    If anyone is having issues with a certain error found in the console about _headbob. (This error: Standalone lambdas cannot be accessed. Consider assigning it to a variable.) The error you're encountering is due to the indentation of the _headbob function. In Godot, all functions need to be properly indented at the class level. Here is the corrected script: extends CharacterBody3D const SPEED = 6.5 const JUMP_VELOCITY = 6 const SENSITIVITY = 0.005 const BOB_FREQ = 2.0 const BOB_AMP = 0.08 var t_bob = 0.0 # Get the gravity from the project settings to be synced with RigidBody nodes. var gravity = 9.8 @onready var head = $Head @onready var camera = $Head/Camera3D func _ready(): Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) func _unhandled_input(event): if event is InputEventMouseMotion: head.rotate_y(-event.relative.x * SENSITIVITY) camera.rotate_x(-event.relative.y * SENSITIVITY) camera.rotation.x = clamp(camera.rotation.x, deg_to_rad(-40), deg_to_rad(60)) func _physics_process(delta): # Add the gravity. if not is_on_floor(): velocity.y -= gravity * delta # Handle jump. if Input.is_action_just_pressed("jump") and is_on_floor(): velocity.y = JUMP_VELOCITY # Get the input direction and handle the movement/deceleration. # As good practice, you should replace UI actions with custom gameplay actions. var input_dir = Input.get_vector("left", "right", "up", "down") var direction = (head.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() if direction: velocity.x = direction.x * SPEED velocity.z = direction.z * SPEED else: velocity.x = 0.0 velocity.z = 0.0 t_bob += delta * velocity.length() * float(is_on_floor()) camera.transform.origin = _headbob(t_bob) move_and_slide() func _headbob(time) -> Vector3: var pos = Vector3.ZERO pos.y = sin(time * BOB_FREQ) * BOB_AMP return pos

  • @nickhurst7493

    @nickhurst7493

    21 күн бұрын

    Thanks! This fixed my issue!

  • @user-un2vb8mr6e
    @user-un2vb8mr6e11 ай бұрын

    Great video, could you make a tutorial that implements head *sway* as well as head bob. Where the head kind of leans/ or rotates side to side when you move side to side similar to in games like Quake, Devil Daggers, Ultrakill, DUSK etc.

  • @legiongames2400

    @legiongames2400

    11 ай бұрын

    That'd be a cool feature for a potential part two, thank you for the suggestion

  • @user-un2vb8mr6e

    @user-un2vb8mr6e

    11 ай бұрын

    @@legiongames2400 you're tutorials are really great for learning godot. Im currently halfway through the third video. You're second video really helped me understand how to use scenes to create prefabs. Although I've had to use shapes like cylinders, squares and circles as the collision shape for the static bodies because the convex shapes were really bad performance wise at least for me. Anyway keep up the great videos.

  • @cynkcaj

    @cynkcaj

    Ай бұрын

    on the off chance you still care about this, just throw "camera.rotation.z = lerp(camera.rotation.z, deg_to_rad(YOUR DESIRED DEGREES) * input_dir[0], delta * YOUR DESIRED RATE OF CHANGE)" in your physics_process

  • @user-un2vb8mr6e

    @user-un2vb8mr6e

    Ай бұрын

    @@cynkcaj thanks

  • @bloxtrider
    @bloxtrider2 ай бұрын

    is it just me or all the godot tutorials way better and easier to understand than the unity ones...

  • @legiongames2400

    @legiongames2400

    Ай бұрын

    Godot is easier to understand than unity :D That's why I use it

  • @calumwoodward9489

    @calumwoodward9489

    Ай бұрын

    @@legiongames2400 please help im stuck in the ground even when i use your code from git

  • @bonsaipropaganda
    @bonsaipropaganda10 ай бұрын

    this is so good

  • @Drivinefire
    @Drivinefire4 ай бұрын

    If you update camera bobbing inside the physics process won't the movement look jittery in higher refresh screens? I can't test it myself but maybe it would look smoother in the normal process.

  • @tommysimonnes1045
    @tommysimonnes104523 күн бұрын

    Thanks!

  • @laithalsaj5243
    @laithalsaj524310 ай бұрын

    Hey! I know this is a bit late for a 2 months old video but can you also show me how we can implement the crouch mechanic as well the slide? That would be very helpful from you, Great tutorial by the way!

  • @ince55ant

    @ince55ant

    9 ай бұрын

    for crouching, just scale down the collision on vertical axis and lower the camera position. also you should do a line trace when uncrouching to make sure your character has the space to stand up for sliding do the same stuff but also stop using the player input for movement/velocity but instead store the forward direction when the slide is first activated and use it for the movement, then decelerate to taste until equal to crouched walkspeed then start using normal crouching behaviour. also make a state machine for movement. i.e. make an enum for movement states like walking/crouched/sliding. then use a switch/match statement to set the velocity in the way each of those states requires

  • @ducky_well
    @ducky_well Жыл бұрын

    nice , thank you

  • @samuelhugo3387
    @samuelhugo33874 ай бұрын

    great tutorial! my character moves well now, I just wanted to ask, is their a way to tune the headbob so that you can match it up with footstep sound? I have added footstep sounds to the game but the headbob doens't happen at the same speed and it looks unnatural, I need a way to increase/decrease the freq of the sin wave

  • @itsdord
    @itsdord2 ай бұрын

    Just thought I'd put it here, if anyone is using a ColorRect on the camera and not getting any mouse input, go to the ColorRect and mess with the mouse settings in the Inspector. It's typically on Stop

  • @CSS-Dist00pia
    @CSS-Dist00pia10 ай бұрын

    thx my dude =)

  • @greenspecgaming169
    @greenspecgaming16928 күн бұрын

    Hey, if anyone is having issues with not being able to move, make sure 'move_and_slide()' is in 'func _physics_process(delta):'

  • @stagnantgiant4235
    @stagnantgiant42358 ай бұрын

    thank you for this, it helped a lot. I do have a question. I would also like to have the camera movement be controlled by the right stick of a controller. I set up the project inputs for it, but how would use them with your camera movement code to have the player able to use mouse and keyboard OR controller to play

  • @JStace
    @JStace4 ай бұрын

    little tip. instead of typing onready etc. drop the node into the script but before dropping it in hold CTRL then release lmb

  • @womp47

    @womp47

    3 ай бұрын

    good tip

  • @jordgoin
    @jordgoin Жыл бұрын

    Really cool stuff thanks. Out of curiosity how hard would it be to add something to handle stairs?

  • @legiongames2400

    @legiongames2400

    Жыл бұрын

    Surprisingly complex topic tbh LOL Not too difficult but it is its own thing, check out this video kzread.info/dash/bejne/e4CKt8WYqbmYZMo.html

  • @JayTube7580

    @JayTube7580

    11 ай бұрын

    I thought you just made an invisible ramp so they didn't get stuck on the stairs.

  • @MichaelFoxtrot
    @MichaelFoxtrot6 ай бұрын

    I have never had to pause a video so many times lol 10/10 would recommend

  • @legiongames2400

    @legiongames2400

    6 ай бұрын

    Music to my ears

  • @mattg6550
    @mattg65508 ай бұрын

    Is there a reason for walk/sprint values being const? If you wanted to add a speed boost or something would it still make sense to structure this way?

  • @rickymolnar

    @rickymolnar

    8 ай бұрын

    Think of the constant values as a base value that everything else builds off of. If you want to add a speed boost, do something like WALK_SPEED * 2.0 to double their speed. Then, when the boost disappears it reverts back to whatever the base speed is.

  • @aesthetichoarder8248
    @aesthetichoarder82486 ай бұрын

    Aw man I did this exactly as he said but my bean fell right through the floor I'll update once I find out how to fix that EDIT: I had the "use collision" button under "CDGshape3d" turned off oops EDIT2: That turned out to not be the problem for me :( weh it still falls through the floor

  • @legiongames2400

    @legiongames2400

    6 ай бұрын

    Do you have a collision shape on your bean?

  • @rapgen5805
    @rapgen58057 ай бұрын

    thank you!

  • @legiongames2400

    @legiongames2400

    7 ай бұрын

    Thank you for watching! :)

  • @lionlight9514
    @lionlight9514 Жыл бұрын

    Hi, great video! I absolutely loved the camera bobbing. I was wondering on how I can add enemies? I'm new to Godot!

  • @legiongames2400

    @legiongames2400

    Жыл бұрын

    Hey thank you for watching! I'm currently working on a level design video & then a video on that exact topic after that. To point you in the right direction for now look into creating enemies with CharacterBody3D just like the player and then adding a NavigationAgent3D so they can navigate your map and chase the player around.

  • @lionlight9514

    @lionlight9514

    Жыл бұрын

    ​@@legiongames2400 Thanks, but why not a rigidbody?

  • @legiongames2400

    @legiongames2400

    Жыл бұрын

    @@lionlight9514 Rigidbodies are not really intended for use with characters you're moving through code. They're more for props or puzzle objects you're pushing and moving around with your character. Rigidbodies are fully physics simulated and instead of the useful move_and_slide function you have to apply directional forces to move them around so they're extremely annoying to use for anything but that.

  • @lionlight9514

    @lionlight9514

    Жыл бұрын

    @@legiongames2400 Ah, makes sense. Thanks!

  • @jamesipoo5939
    @jamesipoo593910 ай бұрын

    would love to see a tutorial on small height differences your character can get on. For reference like a sidewalk. Oddly enough my character will not go onto a sidewalk xD

  • @legiongames2400

    @legiongames2400

    10 ай бұрын

    Yeah it's a little tricky haha :D This is a really cool video covering it though kzread.info/dash/bejne/e4CKt8WYqbmYZMo.html

  • @PastaMaster115
    @PastaMaster1155 сағат бұрын

    This is a suggestion for a good mouse handling format. That way you can capture and uncapture the mouse super easy and also the camera doesn't move when the mouse is visible. #Capture mouse handling if event is InputEventMouseButton: Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) elif event.is_action_pressed("ui_cancel"): Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) #Mouse movement if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: head.rotate_y(-event.relative.x * SENSITIVITY) camera.rotate_x(-event.relative.y * SENSITIVITY) camera.rotation.x = clamp(camera.rotation.x, deg_to_rad(-40), deg_to_rad(60))

  • @x2-gamerz23
    @x2-gamerz2313 күн бұрын

    if Input.is_action_pressed("zoom"): var target_fov = -10.0 camera.fov = lerp(camera.fov, target_fov, delta * 8.0) code for zoom function. (note: add a zoom input key in the project settings)

  • @ruumroom.
    @ruumroom. Жыл бұрын

    I have watched all your rhythm game videos and they are just so cool can u make a tutorial for how to make one ?? would be much appreciated

  • @legiongames2400

    @legiongames2400

    Жыл бұрын

    What kind of rhythm game are you looking to make?

  • @ruumroom.

    @ruumroom.

    Жыл бұрын

    @@legiongames2400 something like friday night funkin looked for a tutorial everywhere but nothing was found then came across your chaneel which had loads of rhythm game stuff if u could make a tutorial for fnf type of rhythm game that'd really help also love your videos!!!

  • @NextLevelLemon
    @NextLevelLemon7 ай бұрын

    If you made an actual character model but it doesnt appear to turn with the camera, you can simply fix that by making the model a child of the Head node. (PS: You still have to make the collision shape a child of the Player.) (PPS: It will come at the cost of your collision not being too accurate so this line of code should fix that: "var.rotate_y(-event.relative.x * SENSITIVITY)" You can visualize the collision moving by making a csg box a child of it)

  • @SuitedGhost

    @SuitedGhost

    6 ай бұрын

    Or just rotate the entire player body instead of the head on the y axis

  • @thepowernerd0
    @thepowernerd08 ай бұрын

    Do NOT put a space in "Vector3" worst mistake of my life Very noob-friendly tutorial so far. This video is my first try at using Godot or any software. Gonna finish the sprint later today. Huge thanks!

  • @legiongames2400

    @legiongames2400

    7 ай бұрын

    Thank you for watching!

  • @Hanham8turkey
    @Hanham8turkey4 ай бұрын

    Every time I’d start up the game my “player” would fall through the floor.

  • @stupidsniper5216

    @stupidsniper5216

    4 ай бұрын

    fax pls help

  • @finercandy45113

    @finercandy45113

    4 ай бұрын

    enable collision on the csg box

  • @Menn9844
    @Menn98442 ай бұрын

    Thank you for the great tutorial. Can I use it for games?

  • @legiongames2400

    @legiongames2400

    2 ай бұрын

    That's what it's here for

  • @menacingskull740
    @menacingskull740Күн бұрын

    THE WAITING FOR GODOT Is INFINITE

  • @wannabecake1
    @wannabecake18 ай бұрын

    amazing

  • @user-he1hs6qk3h
    @user-he1hs6qk3h8 ай бұрын

    That’s cool. How do you change it to third person perspective?

  • @dt295
    @dt295Ай бұрын

    I don't know if I did something wrong or what, but when i did the FOV part from the video, I felt something was off when trying it in the game. When jumping, the script seems to take the speed of the jump momentum and that causes the fov to change, making a strange wave of the fov, going up, down and up, which I didn't like at all. So trying things for like an hour or 2 (with the absolutely little I know about Godot, this is the first video I've seen of Godot, which is very good) I changed this part of the script: var velocity_clamped = clamp(velocity.length() - velocity.y, 0.5, SPRINT_SPEED * 2) It seems that by subtracting velocity.z from velocity.length(), the wave disappears and not only that, but now the fall feels much more powerful the higher you are (but it seems to have a limit), it's quite good. I hope it helps someone, and if I'm wrong about anything, please let me know. I want to thank the creator of this video, because with such a short video, and even me speaking another language natively, it gave me the possibility to try to do things on my own in the code, despite it being the first time I touched it , thank you so much.

  • @mxrgan_
    @mxrgan_11 ай бұрын

    Hey, I was just wondering, how can I put in a camera tilt like in Quake or Half-Life that happens when you strafe? I tried implementing some methods but all of them cause the camera to rotate in wierd ways in game.

  • @legiongames2400

    @legiongames2400

    11 ай бұрын

    You could maybe try doing it with an animation player if it's not working out through code.

  • @nijuatama4362
    @nijuatama43628 ай бұрын

    Just a question for a newbie, is it okay to create the player node and world node in the same scene ?

  • @dithercrisp
    @dithercrisp6 ай бұрын

    This was a great tutorial! The pacing was great and your instructions were easy to understand. One problem that i'm having though is that when i jump my characters trajectory starts to curve to the left when i jump. How could i fix this? It also seems like when i press movement keys my character starts walking in one direction infinitely. EDIT: Nevermind i'm dumb i wrote velocity.y when i should've written velocity.z

  • @legiongames2400

    @legiongames2400

    6 ай бұрын

    Thank you for your kind words!

  • @SuitedGhost
    @SuitedGhost9 ай бұрын

    Some fixes: rotate the head ONLY on the X, but rotate the entire player on the Y. This fixes issues with movement not being updated to your forward direction, or if you have a custom player model the shadow will be off. Also, if you see that your jumping is really snappy and not smooth, just make a new function in your script, like this: func _process(delta): // Your movement here and then copy and paste ALL of your code from the _physics_process to your _process. Makes it so much better :> You can also make a new onready variable at the top called friction. In that same line, set the friction to your speed variable divided by 6 (6 looked good during personal testing). It should look like this: @onready var friction = SPEED / 6 now, in the part where mr tutorial man here updated the smoothing code to just be set to 0, as it didnt work, put the smoothing code back in and replace the SPEED variable in those with friction. Now, you have silky smooth jumping and movement.

  • @solahifuefos9301
    @solahifuefos930117 күн бұрын

    Good video, but as a very beginner to godot ive had to put the video on 50% speed and keep needing to pause and rewind to catch what you're doing without getting instantly lost.

  • @TheRamblingOne
    @TheRamblingOne3 ай бұрын

    4:48 the camera ends up spinning on the z axis, i think ive done everything right. Saw someone with a similar problem in the comments but theirs was because of the way they did their node, mine are the same as yours tho.

  • @NatugnaroGD
    @NatugnaroGD22 күн бұрын

    if anyone is having errors blah blah: extends CharacterBody3D var speed const WALK_SPEED = 6.5 const SPRINT_SPEED = 8.0 const JUMP_VELOCITY = 6 const SENSITIVITY = 0.005 const BOB_FREQ = 2.0 const BOB_AMP = 0.09 var t_bob = 0.0 # Get the gravity from the project settings to be synced with RigidBody nodes. var gravity = 9.8 @onready var head = $Head @onready var camera = $Head/Camera3D func _ready(): Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) func _unhandled_input(event): if event is InputEventMouseMotion: head.rotate_y(-event.relative.x * SENSITIVITY) camera.rotate_x(-event.relative.y * SENSITIVITY) camera.rotation.x = clamp(camera.rotation.x, deg_to_rad(-40), deg_to_rad(60)) func _physics_process(delta): # Add the gravity. if not is_on_floor(): velocity.y -= gravity * delta # Handle jump. if Input.is_action_just_pressed("jump") and is_on_floor(): velocity.y = JUMP_VELOCITY # Handle Sprint if Input.is_action_pressed("sprint"): speed = SPRINT_SPEED else: speed = WALK_SPEED # Get the input direction and handle the movement/deceleration. # As good practice, you should replace UI actions with custom gameplay actions. var input_dir = Input.get_vector("left", "right", "up", "down") var direction = (head.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() if is_on_floor(): if direction: velocity.x = direction.x * speed velocity.z = direction.z * speed else: velocity.x = 0.0 velocity.z = 0.0 else: velocity.x = lerp(velocity.x, direction.x * speed, delta * 2.0) velocity.z = lerp(velocity.z, direction.z * speed, delta * 2.0) t_bob += delta * velocity.length() * float(is_on_floor()) camera.transform.origin = _headbob(t_bob) move_and_slide() func _headbob(time) -> Vector3: var pos = Vector3.ZERO pos.y = sin(time * BOB_FREQ) * BOB_AMP pos.x = cos(time * BOB_FREQ / 2) * BOB_AMP return pos

  • @howtoro-loaf7837
    @howtoro-loaf78374 ай бұрын

    When you say "from scratch" you should mean "without adding template scripts". i wanna learn how to code it myself so i can know how to move a character in different ways in other projects.

  • @ST3FF3
    @ST3FF32 ай бұрын

    I added a dash ability into this template but I have a problem with the inertia. Dashing creates a Vector3 that gradually decreases to zero. The dash vector is then added to the velocity vector and this works well on when on the floor (since I haven't added inertia when on the floor). However when dashing in the air the player velocity gets super fast. Any tips on how to fix this? Here's how I tried to make it work: velocity.x = lerp(velocity.x, direction.x * SPEED, delta * 2.0) + dash_vel.x EDIT: I got rid of the dash vector and just added the dash amout to the velocity and added an if statement for lerping the velocity if it's higher than the const SPEED and now it works

  • @lead1320
    @lead1320 Жыл бұрын

    Thank you for this tutorial! I am planning on making an infinite tower climber with this. For some reason, when I pressed the w key I went backwards, and the s key made me go forward. I switched which one was in the input for up and down, and that seemed to fix it. Do you know why it may have happened?

  • @legiongames2400

    @legiongames2400

    Жыл бұрын

    Thank you friend! :) It sounds like the camera might be facing the wrong way?

  • @lead1320

    @lead1320

    Жыл бұрын

    @@legiongames2400 Thanks, that seemed to fix it. I am now subscribed.

  • @brooke6472
    @brooke64723 ай бұрын

    Do you know how I could add crouching, and make it lower the position of the camera? I tried, doing what I thought could possibly work, but it didn't.

  • @pixelpulsegamingXD
    @pixelpulsegamingXD2 ай бұрын

    when i start the game, my camera falls to de ground and it like im an ant walking

  • @gemzi1426

    @gemzi1426

    2 ай бұрын

    You had probably put the "camera3d" node in the top, you just need to put the "head" node instead, because it's the head node being at the position 0,0 that is actually making you have that problem (I hope you understand what I'm saying, I do not write that much at english, only my code is in english)