Zero Trace (WIP)

Game prototype currently being worked on using Unity 6.
Inspiration
I've always loved open-world games. Ever since I was a kid playing Mafia on my father's work computer, I've dreamed of a game where you can enter every building and every NPC has a real daily routine, reacting naturally to the player's actions. I'm also a big fan of stealth games—especially series like Metal Gear Solid, Splinter Cell, and Hitman. Earlier this year I started playing Shadows of Doubt, an open-world detective game where you investigate crimes by breaking into people's homes, sneaking around for clues, and tracking down the culprit. It sparked an idea: what if I made a game in a similar style, but from the opposite perspective? Instead of playing the detective, you'd play the perpetrator. The contract killer. The hitman.
Prototyping
After setting up a third-person player character, using a low-poly model I have modeled and animated for another project, my first major goal was to generate a city. The city is built on a grid with some streets intentionally broken up and the dead ends replaced with park areas.
Initially, I generated each floor one cell at a time on a 10x10 grid, placing an entrance on a wall facing a street. But this made the city generation very slow and required too much work this early in the project. To speed things up, I switched to using prefabs for ground floors, middle floors, and roofs. This let me focus on getting a functional prototype working before spending too much time trying to generate the perfect city.
Then I filled the world with citizens. They are each assigned a home and a workplace and their daily schedule currently consists of going to work some time in the morning and going home some time in the afternoon.
The biggest challenge was having 1000+ NPCs walking around at the same time. To solve this I'm using a burst compiled job to update the transform of each visible citizen. Citizens that are not visible to the player or are too far away are updated at a lower rate and in batches.
Culled citizen with skeletal mesh and animation disabled:
My most recent goal has been to implement the game loop. I have multiple ideas for how this game could play out down the line. But for now I have a simple arrow pointing towards a random target, and a distance to it. If I eliminate the target, I just instantly get a new one.
I have also started creating some behaviours for the citizen that will be crucial for the gameplay. If a citizen sees the player holding a gun, they get scared, and when they deem it safe they run home.
My next goal will be to implement some kind of police that the citizen can report to. I also have to think about how to solve the stealth aspect of the game, be it security cameras or patrolling security. I think the biggest challenge will be to create a fun and engaging gameplay loop, while still maintaining the open-world aspect that I want to achieve.