I think you are making it kind of complicated. I think that using a RayCast from the gun to check if something was hit, and a particle for the bullet body would work very well.
However if you want realistic bullet behaviour, I see two possibilities. Both use PhysicsBody and work in either 2d or 3d :
Note : I use the names of the 3d nodes, the 2d nodes have the same names with '2d' attached to the end
- Use a RigidBody for the bullet. That's it really, when the gun shoots create a bullet instance in front of the gun, give it velocity with applycentralimpulse and it will collide and react correctly. It however also is affected by gravity, so this might be a tad too realistic
- Use a KinematicBody. The KinematicBody node allows you to move a physics object however you want in the physics_process method. With the test_move method, you can check whether the body is colliding with something. When that is the case, react accordingly (delete the bullet, apply gravity to it etc..)
Those two solutions could answer your question. I however would advise against them, and direct you towards the RayCast solution : this is a case where too much physics could ruin the gameplay, except if it is a core/fun gameplay element.
Hope it helped,