GAD 176.2 — Unity / C#

Procedural Island Generator

Solo Project · SAE Institute
Unity C# Procedural Generation Mesh Generation Perlin Noise Shader Graph
Procedural Island Generator demo
Technical Overview

Terrain Mesh Generation

The mesh is made up of Quads, each consisting of two triangles. Each triangle has three vertices added to an array in clockwise order. A key challenge was ensuring the last triangle in each row was not generated twice — doing so causes unwanted issues with mesh normals.

Mesh generation diagram showing quad vertices and clockwise triangle winding
Hand-drawn diagram: quad structure, vertex ordering, and clockwise triangle winding rules

Perlin Noise

To transform a flat square grid into natural mountainous terrain, Perlin noise controls the Y value of each vertex. A Perlin noise image uses black (0) and white (1) as a gradient — this float value is multiplied against each vertex's Y position to produce organic height variation.

Research for this process drew heavily from Sebastian Lague's procedural landmass generation tutorial series (Lague, 2016).

Perlin noise texture
Generated Perlin noise sample
Perlin noise legend showing black = 0, white = 1
White = 1 (peak), Black = 0 (valley) — used as a height gradient
Wireframe mesh with Perlin noise applied to vertex heights
Flat grid mesh after applying Perlin noise to vertex Y values — wireframe view

Sine Wave Fall-off

To create an island shape, a sine wave is used as a fall-off mask over the Perlin noise. After finding the centre of the generated mesh, each vertex's Perlin value is multiplied by the sine function output. Tweaking the amplitude and frequency of the wave shapes the island's silhouette — combining both produces the final result.

Sine wave diagram showing amplitude and frequency
Sine wave used as the fall-off function — amplitude controls island edge slope
Early island result in Unity with sine wave and Perlin noise combined
Early island result — Perlin noise + sine wave fall-off combined in Unity
Package Features
World Size
Dropdown controlling chunk count.
Small: 4×4 · Medium: 8×8 · Large: 16×16
Resolution
Controls vertex density.
Low: 16 · Medium: 64 · High: 128
Island Radius
Controls the distance between the top and bottom of the sine wave fall-off.
Terrain Material
Custom shader graph with swappable textures — e.g. switch to a snowy island palette.
Noise Intensity
Controls the scale of Perlin noise. Higher scale = more intense, varied terrain.
Seed
Offsets Perlin noise origin. Includes a randomise button (0–10,000) in the inspector.
Height
Controls the maximum height of the generated terrain.
Secondary Noise
Boolean that adds three extra Perlin noise layers for a bumpier, more detailed result.
Reflections

Mid-Point Reflection

Proficiency

Throughout this project I developed my technical skills by watching over 40 videos and reading papers on procedural generation, branching into fields like procedural animation and procedural storytelling. One paper helped clarify exactly what PCG is:

"Procedural content generation (PCG) refers to the algorithmic creation of content. It allows content to be generated automatically, and can therefore greatly reduce the increasing workload of artists." — van der Linden, Lopes & Bidarra, 2014
Process

I researched and followed tutorials repeatedly until confident enough to write my own procedural mesh. After several rewrites I produced clean, well-structured code with a polished inspector interface. Creating a custom island shader proved unexpectedly time-consuming due to limited tutorial resources on Unity's Shader Graph.

Person

This was nominally a group project, but only myself and one other student (Mitchell) contributed meaningful work. Despite reduced participation, Mitchell and I gave each other useful feedback — for example, I helped assess the readability of his Day/Night Cycle. The experience reinforced the value of finding collaborators who are equally invested.

Project-Completion Reflection

Appraisal

I'm pleased with the outcome, though I would have loved to add auto-scaling water assets for different island sizes and a procedural tree-placement system using mesh normals. The project didn't match my initial scope expectations, but after properly researching the topic I feel I achieved something solid and I'm proud of the result.

Challenges

The biggest challenge was implementing a fall-off to the terrain generation. I tried Sebastian Lague's fall-off map method and got it working in isolation, but couldn't integrate it with my chunked terrain system. I eventually solved the problem using sine waves — a method I found through further research. This experience reinforced the importance of broad research when solving specific coding problems.

Future Goals

I'll continue improving across game development, Unity, and C#. In future group projects I'll be more deliberate about team selection. Most importantly, I'll keep setting myself challenges outside my current knowledge — the process of unpacking procedural generation significantly improved my coding skills and confidence.

Resources Used
References

Lague, S. (2016). Procedural Landmass Generation (E02: Noise Map) [YouTube Video]. youtube.com/watch?v=WP-Bm65Q-1Y

van der Linden, R., Lopes, R., & Bidarra, R. (2014). Procedural Generation of Dungeons. IEEE Transactions on Computational Intelligence and AI in Games, 6(1), 78–89. doi.org/10.1109/tciaig.2013.2290371