Rimecraft

Rimecraft is a 3D, procedurally generated voxel game similar to Minecraft. My role in it was to specifically handle all of the programming while the other developers handle the art side of the project. Rimecraft was a University of Washington Bothell Husky Game Dev Club Fall 2020 quarter game jam project.

Source Release

Rimecraft was developed using the Unity game engine in C#. It also uses the Unity Job system to multithread the chunk generation in the project for performance benefits. When working on Rimecraft I had to procedurally define where each block in the world would be through using gradient noise. The gradient noise I used was 2D, for the terrain height, and 3D Simplex, for the caves/caverns. I even layered the 2D gradient noise to get a better more terrain-like look. In this case, the look we were going for was snowy hills.

Other than this procedural generation, I also had to build the meshes and create a chunk system so that the world could be infinite. After all, you cannot have a single mesh to represent an infinite world. Unlike Minecraft, my approach was to use a 3D chunk generation system which allowed the game to have an infinite height/depth too. For the lighting, I took advantage of the High Definition Render pipeline from Unity. After generating the meshes, I needed to allow the player to modify the meshes and the actual blocks in the game. This involved creating an API that allowed anything to modify the blocks. So if I wanted to create explosions I could.

That being said, this was all done in 2 months so there was a strict deadline. I didn't really have much time to explore gameplay so really this project is a tech demo of a procedurally generated world you can explore. Overall during the experience, I learned a lot on creating procedurally generated content and multithreading.

I worked on this project a 2nd time to make Multi-Rimecraft which adds multiplayer to the existing project. To do this, I went with a client-server architecture. I put the chunk generation on the server side (and player representation). To update chunks, I used TCP messages on block updates. For updating player movement, I used UDP as there was no reason for lossless movement.