huge city: low poly or ProBuilder style blocks?

Hey guys and girls, I’d really appreciate it if you could give me some advice.

I have an island covered by this huge sprawling fantasy city. It’s not only vast, it has a lot of vertical structures like towers connected by bridges. The player runs through them, so they aren’t just for show.

Obviously making it look realistic in Unity is a huge strain. I found a lot of nice modular medieval assets in the store but when I imagine adding realistic vegetation (I have Speedtrees and some grass from an earlier project) and details and enemies it just doesn’t seem possible.

But it’s important for the landscape to seem big. Tall, airy. Lots of open space.

So I have two options, I think? Either go low poly or give it a minimalistic stylized look with something like ProBuilder.

Low poly seems too cartoonish, the game story is dark and epic, so it kind of clashes.

Stylized seems too stripped down and blank, though I could build a lot of different structures using textured blocks and this method allows to make the scene bigger.

What do you think? Am I missing some other option?

At least two other options.

One is to figure out how to make it work. Optimise, LOD, occlusion culling, and general smart design to minimise the work required by the computer to get the results you want. Take a look at any open world game on a console and pay careful attention to stuff in the distance compared to stuff up close. You don’t normally notice it, but the stuff in the distance doesn’t have anywhere near the same detail as the stuff up close.

An example in GTA V (just because I was playing it recently) is the rubbish around the city. For about 10m around the character certain areas have rubbish on the ground. Look 50+ meters down the road and there’s no rubbish. That’s because distant rubbish makes a small contribution to the overall look of the scene, but is just as expensive to draw as nearby rubbish.

While it’s harder to see, if you look really closely you’ll also notice stuff like buildings and cars gaining and losing detail as they get closer and further away. When a car is nearby it needs a few thousand polygons to not look chunky. But when its in the distance why draw all those triangles when the player can’t see the difference? So they don’t.

There’s also even more subtle stuff you can do, like changing materials on objects as they get further away (who needs transparent windows on a car you can only just see?), reducing particle counts, combining or removing lights, swapping real reflections for faked/shared ones… Most of this is wrapped up in the “LOD” system, so I’d strongly encourage looking at those.

Basically, if you have a large and complex world you do not just chuck it in your engine and hope for the best. You need to tune the way it behaves to get the most out of your world for your intended experience on your target hardware.

The other way is to reduce your scope. Does the world really need to be as big and complex as you describe in order to get the desired effect? I read recently that even in open world games players really only use a small portion of the space, with the rest essentially being “background”. Do you really need it to be fully open, or will the player mostly be following a bunch of paths? If so, can you make things outside of those paths “background”, and maybe have them visible but not accessible?

1 Like

You could build some code that manages what buildings were in the scene. When the buildings are farther from the player, use low poly assets with no interior content. When the player is close to the buildings, swap in the more detailed version of the buildings. When the player is entering a building, dynamically populate the contents (props, rubbish, NPC, etc) of that building.

The problem you will likely run into with a very large city is with floating point precision at large distances from the origin. You may want to look into implementing a floating origin if you have problems with movements becoming very jittery when the player is far from the origin in the scene.