|Project type:||Student project|
|Production Time:||8 months|
|Tools:||Unreal Engine, Perforce, Jira|
|Team members:||10 programming students 9 design/production students and 8 art students|
Stellar Survivor is a survival/tower defense game made for PC. The game has multiplayer support so you can play with your friends to defend your base.
In the third year, we were allowed to pick from a list of project briefs. I picked the survival game project brief. We ended up with a team of 29 people. We had all of year 3 to work on the game. I worked on several components of the game. A lot of my work did not make it into the end product because the game went through many iterations and some components were scraped.
I worked on multiple parts of the game. Please click on any of the links below to delve deeper into my contributions.
Terrain generation research and testing
At the start of the project, the game designers worked on the concept of the game. The programmers researched and experimented with tech that might be useful for the game. During this time I researched and experimented with different methods of procedural terrain generation.
For my first attempt, I used 2d noise data to generate a plane where I change the height of the vertex based on the noise value from a 2d noise function. I used a combination of Perlin and Voronoi noise.
I also tried procedurally generating a terrain with marching cubes. this allowed for caves and overhangs. But was way more expensive to generate.
Base building system
The base-building system that was originally part of the game was a combination of the base-building system for Rust and Fortnite. The base building system I show here is not used in the game we ended up making.
Trap placement system
After receiving feedback on the state of the game we realized that we overscoped. Our team decided to scrap the base building system to have me work on different parts of the game. Fortunately, I was able to use the base building system as a basis for the trap placement system. The code needed for the trap placement system was similar to the base building system. A trap in the base building system is essentially a base with only one part.
I did not create the minimap from scratch but when I started working on it it was in a pretty early development state.
- Display icons of objects in the world
- Follow the player’s movement
- zoom in and out
- Making the minimap rotate
- Update map image easily
- properly scale icons when zooming in and out
Minimap before I worked on it
Making the minimap rotate
I made the minimap rotate by first passing the player’s rotation to the shader. Then I use the player’s position and rotation inside Unreal’s CustomRotator material function to offset the sample locations of the height map texture.
The minimap shape
Designers requested a square minimap with rounded corners. I implemented a mask so they could easily use any shape.
First version rotating minimap using depth texture(with my programmer art)
Programmatically rendering the minimap
Designer request: “A system to easily create textures needed for the minimap. I don’t know how much manual work it is to replace it but due to frequent map updates we might need to be able to replace it a lot.”
The minimap used to be a static top-down screenshot of the level. But because of frequent iteration, it was a lot of work to keep up to date. I decided to programmatically create a minimap texture to make iterating the level easier.
I used a top-down isometric camera to create a depth texture. I used the created texture and a gradient texture as input data for an unreal material(Unreal’s way of creating shaders). I use the material to render a texture that draws a colored gradient based on height data and draws a border where the height difference exceeds a variable value.
Improving minimap icon clarity
The minimap icons were unclear they overlapped and it was hard to distinguish individual objects. I looked at different games for inspiration I ended up simplifying the minimap icons to simple shapes and adding thin black borders and I made them smaller. This made the individual icons more easily distinguishable.
I also changed the endpoint to a circle so it is easier to see on the minimap when enemies have reached the endpoint.