Here is a tiny article describing how levels are generated in Skeletal Dance Party. It was first released for #notGDC 2019, the game development non-conference for everyone. The article is a brief overview on how I approached adding procedural generated levels to the game and why I did it. It does not go into deep technical details but I hope you will still find it useful for your project.
Skeletal Dance Party is a game about a necromancer hosting a dance party for her skeletons. It is a physically based dungeon crawler where everyone is dancing. And every dungeon crawler needs a dungeon, this is how I created it. First I stated a number of requirements for such a system.
- I want it to be easy to design new levels. I do not have a level design department and want the game to be developed in less than one year.
- The levels should be unique and look pretty, you should not encounter the same level all the time and be filled with cool content.
- The levels should have progression, weak enemies should spawn near start of level and hard enemies should spawn at end of level.
- I need to be able to put story elements in the levels so I can tie story to game play.
In order to save time I decided to buy a system for generating the levels and not build my own. I investigated two Unity assets for this DunGen and Dungeon Architect. I choose to used DunGen because that made adding story elements and progression to the level really easy. DunGen builds a dungeon with a start and end, and you can specify what special rooms to encounter on the way. Dungeon Architect builds a dungeon but I could not figure out how to create a level with start and end.
In DunGen you specify different room prefabs and how they can connect. You can also make some rules for where the rooms can spawn. I added two special kinds of markers in the rooms; potential spawn points for items and enemies. Each level consists of the data structure DunGen uses to describe the generation of the level and a Scenario ScriptableObject that describes level's name, description, metadata and what kinds of enemies and items that are allowed to spawn on it. This makes that creating new levels are really easy, just specify how long the level should be, what the player should encounter and the system will generate it.
The algorithms that runs every time a level is started in Skeletal Dance Party is thus the following.
- DunGen places rooms randomly until level satisfies the required length.
- Inside the rooms props are randomized, this can be things like where lights and barrels are placed.
- Using Unity's Runtime NavMesh Building create a NavMesh covering the level.
- Spawn items and enemies at spawn points. Items and enemies spawned more deeper into the level will have a higher level.
The result is a system which makes it easy to create new levels and to add more content to the game. Downsides of the system is that it can take some time to generate a scene since the process is random. It is also hard to balance the levels since you do not know what the player will encounter.
Skeletal Dance Party can be found on the following stores.