The more UVsets, the more draw calls. If it’s at all possible you want only one but often times you’ll see that the guys at Epic use several. It all depends on what’s more important for you, lowering draw calls or lowering texture memory. For example, a 512x512 texture for the head and a 2048x2048 for the body is going to require less texture memory than a single 4096x4096 texture but it will double the draw calls (IE it’s like rendering the mesh twice in terms of poly count).
Most computers and consoles have a ton of processing power in their GPUs so more draw calls isn’t that bad but it really depends on your target hardware and what else is going to be in the scene.
Definitely if you have separate UVs for eyes, skin, clothing you’ll want to Atlas them into a single texture if you’re planning to release for a PC or console game and absolutely if you’re releasing on mobile.
Another reason for separate texture sheets is translucency. Often times in the past engines have had a huge issue with translucency being on the same material which can cause weird draw issues where the polys don’t render properly (Source engine is notorious for this) but UE4 seems to have sorted this out as of 4.16 by adding in the Surface Translucency Volume option for lighting a translucent material.
In the world of game engines draw calls is the new polycount where how they are used can just as easily be optimized based on screen space percentage as well as the ability to decrease shader complexity as part of the sum total of the per frame render. How fast the screen is refreshed, a function of draw calls, is of more importance over and above the current FPS as to the current state of hardware rendered solutions. You could have high frames rates as to a targeted output but the resulting per frame render could be sluggish as to responding to player input for example.
That said there is the “inherited” loss of performance that is applied to the concept of best practice as applied to what at face vale it’s assumed to introduce performance loss to a given resource requirement.
Lets say your character has 16 material ID’s? Does this represent a performance loss?
Maybe.
To put it into context.
Lets say up close you have a total per frame draw call of 500 and moving back you double that to 1000 based on using complex shaders. Using the LOD feature you could create less complex shaders so at distance the total count is lowered to 500 equal to the up close version.
Then of course there is the use of instanced materials that will auto adjust to output based on the activation of the current LOD slot.
Overall best practice advice is to profile your project which will give you the numbers to prove or disprove what has been accepted as best practice.