well actually what i do is UV map the model completely, splitting the UV map at each sharp corner (usually around 90* or higher), but thats not a rule of thumb. the main point is to make your UV layout make sense, to use all the UV area you have at your disposal, and to make sure your UV layout will work well together with the texture you paint on it. Like for example if you have text or some intricate detail somewhere, you cant really put a seam there.
after the UV map is finished, assign each UV island a smoothing group using the "Smoothing Groups from UV shells" tool in the tex-tools plugin. This basically just assigns each UV island a smoothing group, making sure two adjacent UV islands dont have the same SG. its a really handy plugin.
Ive seen people just make the whole model in to one smoothing group but thats not a very good idea. It may work for less complicated models but with stuff like guns, it usually makes the normal surface of the model very "bumpy" if you will, and the normal map you bake will have a hard time coping with that, especially when mip mapped.
In any case, you cant make the whole model in to one UV island, so you might as well split the SG's as well seeing as its so easy with the plugin.
Now as for your model, you're on the right track. Its not necessary to model everything as one object, its just important that you dont have intersecting geometry. Its ok to have seperate pieces in your model, as long as theyre not trying to occupy the same space... and its not really THAT strict, just if you do have some small intersecting bits somewhere try to keep the seams of those bits out of sight, since the seam is usually pretty ugly (like if you look at the shell deflector on my M4 with the normals applied). Also keep in mind that you're going to be animating, so obviously moving bits like the trigger, charging handle, mag and whatever else you want to move around are seperate objects.
Also you really need to take a look at those useless edges you have everywhere.. you could probably split the polycount in half if you optimized the edges properly.