For a start, a short introduction. We are working on
Empires in Ruins with pre-rendered 3D models, which are converted into sprites and atlas of sprites before being saved in Unity. In short, it takes a rather long and slow production process, but it allows us to use very high resolution textures for very sharp graphics. This style is reminiscent of the strategic games of the 90s like Age of Empires (and many others) mixed with the Baldur's gate production process, complemented by modern style and the possibility of strong scaling. We generally like to make an impression.

I must say that we are
absolutely satisfied with the results so far, and people on the Internet also like them, but we will rather agree to torture than begin to make another game in the same style.
')
The reasons are simple: the results may be wonderful, but in fact it is difficult to find a slower workflow. For the very first game, this is quite normal, the work continues indefinitely, and we enjoy the process, the lesson is learned. But in the future it is still worth releasing one game more often than once every five years.

If someone does not believe me yet, we will list the reasons. I suggest to study them if you are thinking about creating an old school isometric strategy in Unity3D.

I am sure that you are well prepared, and know all the proposed (and usually very useful) optimization techniques when working with Unity. It is time to apply them in the new game, and fail over and over again.
- If you need depth in the scene, then forget about the batching. Even two objects with the same sprite and material located at different depths (either along the Z axis, or in sorting layers) with several objects between them (and this happens often) will require one draw call per each. And there are no limits. PS For this reason, forget about the release of the game on mobile platforms.
- If you prefer 2D instead of 3D, because you are afraid of the number of triangles, then do not think that when using sprites with the alpha channel of the triangles there will be much less. Sprites with an alpha channel, that is, with an uneven contour, can also use a variety of triangles and vertices.
- Always use atlas of PoT sprites (Power of Two). Especially if you need a high resolution and high zoom level, only this will save the game from disk overflow (do not forget to pack textures in Unity before the final build) and video memory. Not that you can save PoT-atlases to a floppy disk if objects have many animation frames in different directions, but you will have a chance to take less space than Mortal Kombat X.
- Get ready for problems with mathematical calculations. Suppose you need to simulate perspective trajectories, like 3D, on a flat surface with an orthogonal camera looking at it. This is possible, but not as simple as it may seem at first.
- Another huge problem will arise when the animation is a bit more complicated than the base ones. If you do not break them into several sub-animations (with the inevitable creation of cumbersome animators to control them), what happens, for example, when attacking a soldier? So, he is preparing to strike, and frame X must deal damage, reproduce the sound of impact, etc. Well, how about telling the game when this happens? The only sensible way is to add an event to the animation, and for now everything looks fine. But one big problem at first is not so obvious. Naturally, you want the game logic to be executed in FixedUpdate (because in this case it will be reliable and deterministic), but the animations are performed in a simple Update. Already notice the coming problem?
- Always enable MIP texturing. Do not even ask yourself, do it on the machine. Enable MIP texturing if the game does not have a single zoom level. Do not forget that when you enable MIP texturing, textures grow in size (imagine that we have a texture of 1024x1024, when generating MIP textures, Unity will create versions 512x512, 256x256, etc.). I'm not trying to teach you how to MIP texturing, but you just need to know what it will need.
- Create pools of objects. If you are trying to reduce the load on the processor, a bunch of calls to Instantiate and Destroy will NOT be your best friends!
- You really like Unity physics? It is a pity that gravity is not coordinated and it cannot be coordinated with the simulated vertical axis of your game world. Well, life is unfair.

And at the end summarize:
- It is almost impossible to avoid a large number of draw calls. Rendering calls can create "bottlenecks" in the processor and reduce FPS. The solution is to make everything related to gaming logic as smart and easy as possible. Use corutories, think, maybe some operations can be performed not every frame, but, for example, once every x frames. If possible, optimize the game for batching, but keep in mind that a lot can not be done.
- Large textures and large sprite atlases heavily load video memory. Do not forget this and always strive for the best performance of the game on the target platforms. Of course, nowadays computers are infinitely more powerful than they were just a few years ago, but if you don’t make the game just for the most powerful PCs (and this is probably not the case), then it’s crazy to take more than 1 GB of video memory.
- Type in a team of very good animators / 3d-artists - the animation of the sprites does not forgive mistakes and it can not be controlled when it falls into Unity.
- Carefully read the 2d assets in the Asset store. There are many assets, which for a couple of dollars will save you many hours of painful work. Therefore, it makes sense to buy them.
- If you want to, apart from working out, you have enough time and privacy, it is better to have a game in a different style.
- The Unity Profiler is your best friend. Spend on it as much time as you need, and it will be rewarded a hundredfold.
Well, well, maybe I had a difficult week, during which I had to face most of the problems listed in this article. It may not have helped me gain optimism, but I admit that we have improved a lot over the past few days.

If I am mistaken in something, please prove that I am wrong, and skip the link indicating that something can be improved. I really hope that I was mistaken, and I want to find new ways to further optimize my game!