
Runtime Mesh Deformation in Unity (Footsteps, Damage, Softbody Physics)
June 29, 2026
Greedy Meshing Algorithm for Voxel Terrain in Unity
July 1, 2026Procedural caves are a popular feature in many sandbox and exploration games. Instead of manually designing cave systems, procedural generation allows developers to create natural-looking underground environments automatically.
Games such as Minecraft, Terraria, and No Man’s Sky use procedural cave generation to build massive underground worlds.
One of the most common techniques used for cave generation is Cellular Automata.
What Is Cellular Automata?
Cellular automata is a simulation technique where a grid of cells evolves over time based on simple rules.
Each cell can be either:
- Wall
- Empty space
By repeatedly applying rules to neighboring cells, the map slowly turns into natural cave shapes.
Step 1: Creating the Cave Grid
First, we create a 2D grid that represents the cave layout.
int width = 100; int height = 100; int[,] map = new int[width, height];
In this grid:
- 1 = wall
- 0 = empty space
Step 2: Randomly Fill the Map
Next, we fill the grid with random walls.
void RandomFillMap()
{
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
if (Random.value < 0.45f)
map[x, y] = 1;
else
map[x, y] = 0;
}
}
}
This creates a noisy map that will later evolve into caves.
Step 3: Apply Cellular Automata Rules
We now simulate cave formation using neighbor rules.
int GetNeighbourWallCount(int x, int y)
{
int count = 0;
for(int nx = x - 1; nx <= x + 1; nx++)
{
for(int ny = y - 1; ny <= y + 1; ny++)
{
if(nx == x && ny == y)
continue;
if(nx < 0 || ny < 0 || nx >= width || ny >= height)
count++;
else
count += map[nx, ny];
}
}
return count;
}
Step 4: Smooth the Cave
We apply smoothing iterations to create natural cave shapes.
void SmoothMap()
{
for(int x = 0; x < width; x++)
{
for(int y = 0; y < height; y++)
{
int neighbours = GetNeighbourWallCount(x, y);
if(neighbours > 4)
map[x, y] = 1;
else if(neighbours < 4)
map[x, y] = 0;
}
}
}
Running this function multiple times gradually produces cave-like structures.
Step 5: Converting the Grid into a Mesh
Once the cave map is generated, we need to convert it into a visible mesh in Unity.
A common technique for this is the Marching Squares algorithm.
This algorithm analyzes the surrounding cells and generates triangles to form cave walls.
The result is a smooth cave mesh rather than a blocky grid.
Adding Vertical Cave Depth
For 3D cave systems, you can extend the grid into a 3D volume.
int[,,] caveVolume = new int[width, height, depth];
This allows caves to have multiple levels and tunnels.
Connecting Cave Rooms
Sometimes cave systems create isolated rooms. To fix this, you can connect regions using tunnels.
Typical approach:
- Detect separate cave regions
- Find closest points between regions
- Create tunnels between them
This ensures the player can explore the entire cave network.
Adding Cave Decorations
After generating caves, you can populate them with objects such as:
- Stalagmites
- Crystals
- Underground lakes
- Minerals
- Enemies
Instantiate(crystalPrefab, position, Quaternion.identity);
Performance Tips
- Generate caves per chunk
- Use mesh simplification
- Use object pooling for cave props
- Generate caves asynchronously
Games Using Procedural Cave Generation
- Minecraft
- Terraria
- Deep Rock Galactic
- No Man’s Sky
Procedural cave generation allows these games to create massive underground systems with minimal manual design.
Final Thoughts
Procedural cave generation adds depth and exploration to procedural worlds.
By combining cellular automata, mesh generation, and chunk-based terrain systems, you can create complex underground environments that feel organic and natural.
Once integrated with your terrain generator, caves can become a core part of your game’s world design.










