Complete 3D Shooting Mechanics - Godot 4 FPS Tutorial
HTML-код
- Опубликовано: 3 авг 2024
- In this Godot 4 tutorial we create implement complete shooting mechanics for a first person shooter game including how to make a weapon. The covered topics include gun animations, projectile bullets, complex bullet collisions with body parts and weakpoints, dying animations, and enemy despawning. These mechanics can be used for many types of games, including FPS, horror, survival, RPG, etc. All of this code works with Godot 4.1.
Support the channel: / legiongames
The project is available on GitHub: github.com/LegionGames/Shooti...
Assets:
Zombie model: www.mixamo.com/
Ground texture by 0melapics: www.freepik.com/free-vector/e...
Kenney Graveyard Kit - www.kenney.nl/assets/graveyar...
Steampunk Rifle by Jake Sharp - poly.pizza/m/1aBSH8_oopt
Wishlist Game: store.steampowered.com/app/21...
Discord: / discord
Itch: legiongames.itch.io/
Twitter: / legiongames1
Instagram: / legiongames1
TIPS:
1. Hold control while you click and drag a node from the scene hierarchy to the script to create a full @onready var
2.There is a Translate() function that changes the nodes position. Could simplify the bullet movement slightly.
Oh my god thank you LOL that's gonna save me so much time :D :D
#1 for some reason doesnt work on mac :(
@@neptun3189 try command
@@legiongames2400are you sure you didn’t leave any major details out when spawning bullets? I’ve looked at this video countless and still can’t get them to show up even when I used nodes and code. Don’t dodge the comment.
I tried this an the is_playing function returned null, crashing the game. I had to manually type $ name of 3d node attached to player / camera of player /...
and then the animation player node and its animation appeared.
awesome workaround for the collision shapes of enemies. Thank you
Just started on the 3D game development journey in Godot and the 3 tutorials are super helpful. Thanks!
Thank you! :)
This has been one of the most helpful tutorials I’ve found so far. Thank you!
Glad it was helpful!
Another great tutorial with all the code working as it should.
It is fast paced which allows you to put more ideas and solutions into the video without dragging on.
These are incredible. I love how succinct they are. Keep this style up!
This is some of the best godot content I've come across so far
Thanks for the tutorial! There is not many godot 4 tutorials so yours are a huge help to beginners
Thank you, I'm glad you're enjoying my videos!
@@legiongames2400 can you make a video showing how to make a player interact with rigidbody3ds and be able to pick it up and throw it?
3d btw
Nice tutorial. GJ on being crispy clear on ur words!
What a legend, fantastic video mate, keep them coming.
Thank you! :)
I recalled your video many times, so many good and essential stuff around it! Thanks for the knolage shortcut!!!
Thank you friend! :)
Love the tutorials so far ❤
Yay! :)
Love your tutorials man. Keep them up =)
Thank you friend! :)
I liked this video months ago, but I keep coming back for top tips ♥
PERFECT : simple, fast and very well explain for newbies
This series is going really well!
Thank you! :) Any other FPS topics you would be interested in?
@@legiongames2400 close range Melee weapon would be a good idea I suppose :)
10/10 tutorials need more!
it looks great, thanks for sharing
Thank you friend! :)
Looking great, thank you. I’ve added sound and made it quite a bit darker. Very fun to shoot those undead.
Nice, the bullets prob look cool flying around in the dark haha
I i hate the way people always rush to do stuff without letting viewers see it
I know right, really annoying!
fr, which is why you shouldn't get dependent on tutorials
@@memze1148 exatly
You have a fantastic foundation to create a simple COD zombies game, maybe. i have near zero experience in game dev so i truly wouldnt know
regardless, these tutorials are awesome
yeah it was actually the inspiration for the series haha :D thank you!
God Bless you bro, this tutorial is amazing!
Thank you! :)
Great tutorial, thanks
Thank you!
Your tutorials are the best😎
thank you man! you're a real life saver
Glad to help :)
Great Tutorial Keep Going 💪
Thank you 🙌
very neat well done
Thank you :)
I had a problem where my bullet had multiple problems, so here is my solution for future generations.
The problems; my bullet spawned way over my head and fired in a direction that wasn't quite where I was looking but picked a direction relative to how rotated my camera was. the bullet also curved as I turned my camera mid-flight.
the solution; I replaced "get_parent().add_child(instance)" with "get_tree().root.add_child(instance)". this gets the root node of your level and makes the new bullet a child of that.
Thanks you!!! You fix My problem
Thanks man this fixed my issue
You are an Excellent Teacher !
Thank you friend! :)
@@legiongames2400 Excellent Keep up the Great work . Thank you for the video .
really helpful series, it would be nice if the video about enemies with skeletons had a warning that the 'generate skeleton' thing is kinda broken, i had problems with it as well.
I think the collision boxes now work with the animationtree without having to redo them. They reworked AnimationPlayer and AnimationTree between 4.1 and 4.2 so it could be related to that.
With every bullet the memory goes higher and higher....
Thank you
Your 8 guns joke convinced me to sub, like and keep the bell active haha 😂😂
Thank you friend! :)
nice if you did a weapon pick up and drop system. And thanks for this tutorial
Thank you for watching! :) :)
Your tutorials are amazing. I'm upset with myself for the ways I did things. Being new to Godot I did not know about "clear inheritance" and had no idea how to get hitboxes to be children of the bones. So, I grabbed the skeleton object in GDScript, found positions of two bones I wanted the hitbox between, and applied linear interpolation between them to place the hitboxes where I wanted. It looks a lot easier being able to make the hitboxes child nodes of the bones. lol
lol at the end. love it.
hehe
HUGE thanks ♥♥♥♥♥♥♥♥♥♥♥
The Best!
Hehe
The 8 guns joke was...very satisfying.
You have the best fps tutorials for godot thanks for sharing and contributing to the godot community
Thank you for watching them! :)
When I press the fire button, the bullets aren't where the ray cast is. They also change position (On the Y axis) depending on where I am in the play space
Bullet:
extends Node3D
const SPEED = 40.0
@onready var mesh = $MeshInstance3D
@onready var ray = $RayCast3D
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
position += transform.basis * Vector3(0,0,-SPEED) *delta
Gun:
@onready var gun_animation = $Sketchfab_Scene/AnimationPlayer
@onready var gun_barrel = $Sketchfab_Scene/RayCast3D
var bullet = load("res://Scenes/bullet.tscn")
var instance
func _process(delta):
if Input.is_action_pressed("Click"):
if !gun_animation.is_playing():
gun_animation.play("shoot")
instance = bullet.instantiate()
instance.position = gun_barrel.global_position
instance.transform.basis = gun_barrel.global_transform.basis
get_parent().add_child(instance)
What's better than 8 guns....
Neo: "Guns, lots of guns."
only thing missing is multible weapon types and ammo to pick up
What kind of weapons would you like to see?
@@legiongames2400 the usual or something "fun" to take out zombies, like a chainsaw, scythe or a ladle 🤣
melee, rockets and switching between them
@@tonnypedersen5915 I freaking love chainsaws
which video you make animation for "die" ? i miss it. :))
so it doesn't work in godot 4.1? i can't seem to find the "get_simple_path". is there another method for it?
Awesome tutorial!! I'm just having trouble getting the bullets to start at the gun barrel. I've followed the tutorial closely but for some reason the bullets are not aligning with the gun barrel.
Use global_position instead position
Please help the following line from the bullet just does nothing at all, the bullet spawns but doesn't move,
position += global_position * Vector3(0, 0, -SPEED) * delta
I tried adding a print(position) below this to have it print it's position, more to see if it was even running the code in the script, but IDK if that is a valid way of doing it, but if it is it seems like once it's spawned the code on the script isn't running?
Amazing!!! can u add audio to it??
Nice tutorial! Are we getting anymore content in this zombie-shooter series?
No plans atm. Not because I'm not interested in doing more, just not sure what people would want to see. What other FPS topics would you like me to cover?
@@legiongames2400 Here are some suggestions! Different weapons, wave based combat, upgrades and perks, different enemy types, nav mesh links, ammo count. Maybe you could take a look into one of those?
@@legiongames2400 Range-based enemies and more gunplay stuff would be interesting. (Shotguns melee etc) Perhaps aesthetic stuff like bullet impacts and footstep sound effects? I don’t mean to overwhelm, I hope these give you some ideas!
Ooh! May I also recommend ragdolls?
@@catjox_45 That's a lot of ideas, thank you. I think I will take a look at some of those like more weapons and ranged enemies. Ragdolls I really wanted to get done for this one but the physical skeleton breaking kind of threw a wrench in my plans so probably worth revisiting. Seriously, thank you haha
When the player is strafing, the rifle muzzle raycast is offset (to the left if strafing left, to the right if strafing right), before lerping back to its position (only after the pressed button for strafing is let go). Does anyone know how I could solve this issue?
I have a doubt. If the fps goes down, maybe the bullets pass through the enemy and other colliders?
I can't change the materials on the models for some reason. When i try that it says that i cant change materials on imported models. Does anyone know how i can fix this? Because i've seen other people do it
Sometimes the bullets just hit the floor without showing the particles. Is there a reason for this?
The 8 guns got me 😂😂
Glad you like :D
Would you also be going over animations for the gun?
Working on gun switching right now
🔥🔥🔥🔥🔥
super))
Thank you! :)
when i run the game the bullets only colide some times only i tried every thing but its not working????😥😥😥😥
For some reason when I walk forward my bullets go in reverse here's my code: var input_dir = Input.get_vector("Left", "Right", "Up", "Down")
var direction = (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 = move_toward(velocity.x, 0, SPEED)
velocity.z = move_toward(velocity.z, 0, SPEED)
move_and_slide()
Help my bullet phases past objects then on the other side explodes into particles.
10:25 well this is awkward now... in your previous tutorial you were only talking about the three animations "standup", "run", "attack", not about the "die" animation.
How can I now add a fourth animation to the already existing model? If I reimport from blender, all the previous work (position track in standup, hit-frame in attack, animation-renaming) will overriden right?
Can I somehow retarget an existing animation onto a different model (import 2nd zombie model just with "die" animation and then retarget to existing zombie)?
Well I can tell you that the offical guide in the godot docs regarding animation retargeting... did not work for me ^^
Godot does not seem to find the right bones unfortunately...
What do I do now?
I figured something out: If you wanna add a new animation to an already existing model, reopen the existing zombie.glb in Blender, then import the glb with the new animation (in this case "die") stash it into the NLA, and then when it its reimported in Godot you cann see the new animation there.
Just for info: animation retargeting did NOT work for me, I had to do it this way...
You can copy the animation keyframes into a new animation if you import another model with the extra animations.
Figured out how to copy the animation keyframes to a new animation. You have to click the "Edit" -> "Copy Tracks" to copy it (took me forever to find this)
@@asdfhjklacew How come the "Edit" button for this is greyed out for me? How do I enable it so I can copy the track?
can you pls make tutorial for weapon system so can easily add more type of weapons
Yep! Working on that right now! :)
my bullets are getting stuck midair and colliding with nothing :c as soon as i added the collision code
Hi
Which programing language use in this engine c plus or c sharp or both of them are use in this engine and if we know just one programing language is it benefit for use godot or not.
This tutorial is in GDScript. Godot has a lagging support for C# and as far as I know there's an extension for C++.
For me sometimes the collision wont trigger, using simple boxes and spheres on a level.
From specific angles and distances the bullet collides correctly and sometimes couple inches to the side the bullet goes right through.
Not sure this is a limitation of the engine for fast moving objects or i got something wrong.
Hi, sorry if im a bit late, but for me making the raycast longer and lowering the bullet speed worked.
@@kaliss6110 Yeah i did some of these changes but it really seems like a limitation of the collision shapes at higher speeds, since even with the bullet at really slow speeds it did skip some collisions but more rarely, i tested in a clean project with nothing except the bullet instantiation and it persists, since i mostly like to mess around with 2D games i ended up not searching a lot more.
The things i did:
Slow bullet, longer raycast, swap raycast for a collision shape and use signals, faster bullet (because why not), and changing some physics options in the project settings.
The only thing really worked was wit scan bullets using a raycast, those detect correctly, i just spawn a instance of the particle where my raycast collides when i click.
Question, i just finished the body part script, and it works with headshots which the original signal and stuff is attached to, but whenever i hit a non head body part, it crashes and says
"Invalid call. Nonexistent function 'hit' in base 'Area3D'
im confused and not sure what is wrong here, how did he set up the signal again? he did it so fast maybe i did something wrong
I got the same issue, if you figured it out let me know!
im a total goober and didnt realize this, he skipped over it, but you are supposed to attach the same script and signal to every body part, look at the before and after of him saying so @@themindlesstruffle
I had a script attached to every area 2D with a hit function that passes it on to the the parent enemy script. Thank you for watching!
can u make a Tutorial for a 3rd person shooter (Tps) ?
i make 3d fps game for mobile, but i will try to play in mobile ,
i will touch(swipe) mouse motion only, it will work properly, and i will touch (move) joystick only, then joystick work properly, but i will use both of them, first i will touch mouse motion and after touch joystick, both of them work properly but first i will touch joystick and after touch mouse motion , joystick will work but mouse motion not work, 😢😢how to solve please help
How do you combine all the scenes into one called world, and also can you use arms to holding the ❤nice video by the way❤
What do you mean by combine the scenes?
@@legiongames2400 nvm I figured it out, by the way do you any discord group bro? Iam currently working on a similar game (iam a beginner)
@@who_tf_asked Yeah theres a link to the discord in the video description!
Can you add a melee weapon?
Brother i need ur help actually i trying to built a game that based on Dead by Daylight and u know i am beginner or u can say worse than beginner so i created Map and add some model set camera but some problems with Scripting 😢😢
My particles only emit a fraction of the time. Most hits don't emit, even though it is colliding. Any idea what I'm doing wrong?
That's a weird problem, I'm blanking out tbh. What's your bullet velocity? Also what's the particle velocity?
@@legiongames2400 i believe its the weapon speed or the raycast 3D not working correctly as if i slow down my bullet speed it works more than if i increase it, any fixes?
same problem here. going to mess with the raycast length and collision layers.
EDIT: Lowering the speed and increasing the raycast length worked.
Idk if I should post this here or elsewhere, but I'm having trouble with the bullets colliding with the air and I don't know what I did wrong, can someone help me??
Hey the issue might be with the size of your collision shapes on your obstacles or the bullet collision raycast may be larger than your bullet mesh!
i used marker instead of a raycast for gun's barrel.
what to do if it reports an error that there is no function is_playing in the code: if Input.is_action_pressed("shoot"):
if !gun_anim.is_playing():
gun_anim.play("Shoot")
instance = bullet.instance()
instance.position = gun_barrel.position
instance.transform.basis = gun_barrel.globale_transform_basis
get_parent().add_child(instance)
im getting the same error
I did everything as in the video, but at 5:08 my pistol cartridges do not fly out
I can't put the bullet speed to high, more than 40 and the bullets are not colliding, it probably has to do with the raycast not detecting the collision thanks to the speed?
I would like the bullets to travel faster, so it's less time to make it to the enemies.
If someone know what it could be, I would appreciate the help.
hey, i was having this problem and i could fixed it adding this line of code before the if on the raycast.is_colliding():
it should look like this:
raycast3D.force_raycast_update()
if raycast3D.is_colliding():
@@revn45 Thank you very much, had the problem that some of my bullets just didn't collide with the floor and that fixed it.
How do you import the animations after you already have the character?
You can copy the keyframes over if you import another character with the extra animations you want to add.
I JUST NEED TO KNOW HOW TO MAKE THE BULLETS APEAR AND GO FOWARD
Can you do a tutorial of blood particles when you hit an enemy?
Did that in my hitscan tutorial video
May I ask where does the player scene come from? Many thx ❤
I made a first person character controller tutorial, it's basically built on top of that.
dude, like seriously, the eight guns thing makes this look like a mech game. and honestly, you would probably have a minor successful game if you make an 8 guns game where you can shift out each gun depending on their energy usage, size, weight and recoil for instance. Making it such that players have to make decisions on which guns to bring and so fort and each gun should obviously have a specific use such that it actually matters. then you can add on top of that mech parts like legs, reactor, shield and so on such that you have to balance your mech to support the guns. and then of course add tons of zombie mech enemies players can demolish for fun.
I should be paying you that's a whole game right there LOL
Is there an easy way to transform the keyboard and mouse input to a simple controller input script?
Controllers are a little trickier with partial inputs on the different axis for walking, so it might be easier to write the controller script first and then transform that to support the keyboard.
@@legiongames2400 cheers I will give that a try
been trying to make a 3rd person shooter and its just not happening. not sure why, even with testing everything logically is there, but nothing works
EDIT: after bouncing back and forth with a legend of a friend, i have concluded that you must not adjust the transform of your main root node. and also, printing positions of your instance and or players was a huge help in finding my issues
example:
print(position)
print(instance.name)
print(instance.position)
print(instance.global_position)
how to make artillery in godot plis help
the engine is telling me that the function instantiate doesn't exist any idea how to fix it? because you're using it to spawn them in
What version of Godot are you using?
@@legiongames2400 at the @onready bullet I had put the wrong thing from resources after i copied the correct one in it worked
I am using the latest and getting the same problem
@@legiongames2400
@@BoiNatty I hate it everytime Godot gives me an error just because I'm using a slightly newer version, all this error happening because of version difference, If you don't want error, you have to use EXACT same version as the version that the tutorial is using, so basically you need 5 months old version of Godot if you don't want any error, typical Godot problem, Godot keep change everything each version I hate them
i mean, why not use the animation player to just queue_free the zombies? you can call methods from the tracks themselves, you just have to set the condition to play and save a few lines of code with no timers and anything
Yeah you right, might as well have done that
Z is depth so doesn't it kind of track that it represents the objects distance from the screen instead of up and down like blender? In 2D Y is vertical and X is horizontal, converting to 3D is just adding the element of depth or Z. This is one of those things that should really be developed according to one standard just like introducing a system of measurement or adding right angles.
People who made Blender like strategy games too much. :D
@@legiongames2400 lol
why douse my bullets shoot horizontally?
Can I do this on godot 3
The vids are awesome. But next time please use simple assets
That's a little boring though, why?
For some reason, my bullets won’t spawn in when I try to shoot them and instead the game crashes?
I'm having the exact same problem where I'm getting an error that says Invalid set index 'position' with value of type Vector3
What error is it giving you?
@@legiongames2400 hey, i know this is kind of a long shot, but i'll take a shot in the dark as i'm having the same issue. the original error i got was "Invalid set index 'position' (on base: Callable) with value of type 'Vector3.'" So, realising that position returns a Vector2 value I replaced both position and global position with .global_transform.origin, and now get the error code "Invalid get index 'global_transform' (on base: Callable)." Is there any way you could help me?
Hey, if I have 1 spawner, how to make 1 zombie come out of it and not appear again?
what do you mean by not appear again?
@@legiongames2400 I think they mean that 1 spawner will only -spwan- spawn one zombie!
@@StrangeStar141 yes
dude pls help Im on an iMAC and I ran the project and the game is so laggy i could barely move the camera
What kind of hardware do you have on it? Id say mess around with the shadow quality and maybe lower the resolution?
Anyone know why the bullets are flying out of the floor of my map instead of the gun?
I had the same problem but after messing around with the bullet code I figured out that the bullet will fly straight if you change the Y float to -SPEED instead of doing that to Z so in the code for the bullet under the _process func the floats should look like (0, -SPEED, 0) hope this helped
Why is it so blurry :(
I'm getting this error, I've followed exactly and idk what went wrong Invalid call. Nonexistent function 'instantiate' in base 'GDScript'.
have you found whats causing the problem? i ran into the same issue!
@@patitoMenemista No sadly
You didnt have it attached to the right kind of node
why does the instantiate function not exist for me?
If you're using an earlier version of Godot like 3.5 it used to be called "instance".
bullets hits enemies but they dont die
2:29 I can,t find the animationplayer in my list
FIXED IT XD