One Drop Bot
Overview
This game is a 3D puzzle platformer I released on Steam, Itch.io, Gamejolt, and Kartridge. The game is made up of a linear group of rooms. Every room has a completely different challenge in it. The game was developed in Unity.
Movement
I made the character movement for this game pretty much from scratch. I made custom momentum for it. A combination of built in collision along with spherecast checks for staying grounded and going up small ledges smoothly.
When the player faces an object marked as pushable, the robot will start pushing it. When pushing is enabled, it slows down the player’s move speed and moves the object along the axis it’s being pushed.
Advanced Camera System
I came up with a camera system that had 4 different modes: free, tracked, static, and follow. All of those modes are used in game plus many other little options. It is designed to move on its own.
The free mode allows the player to move the camera around.
Tracked mode moves the camera along a track depending upon the position of the player.
Follow is similar to free in that it positions itself where the player was before.
Static, as its name suggests, doesn’t move.
All of these come together to make interacting with a 3D environment feel natural without having to take full control of the camera.
In this gif you can see how the camera transitions to intermediary positions before going to its next destination in order to prevent clipping.
Health Bar
The health bar is a combination of a shader and a script. The shader uses a ramp texture and moves along it based on the angle facing z axis to get this look. And when a life is lost it “explodes” also using the shader to create the explosion effect.
At an angled view you can see how the lives layer behind the last one. The view in game then creates the cool effect you can see here.
Most Complex Puzzles
• Logic Puzzle
The square structures are gates and switches. The gates are all kinds of logic gates(and, or, not, xor) depending on the structure.
In order to keep things simple, I made it so all the gates share the same two materials. One for the on state and one for the off state. When a gate turns on or off it switches materials. So instead of having 12 different materials for the logic gates, there are only two.
This also applies to the cords even though they are less complicated than the gates. They come in three varieties: T, L, and I shapes. So having them share a material helps as well.
I made a modular system for the logic gates. There’s an output side piece, an input side piece, a blank side piece, and a bunch of middle pieces, one for each kind of gate. The UVs were laid out in a way that would save space in order to keep the texture at as low a resolution as possible while still looking clean.
In order to turn on or off the switch you have to push it. However, the pushing mechanic that I made doesn’t work on rotating objects, so instead of pushing a rotating object, the player pushes an invisible box that clamps to a minimum and maximum distance. The switch then rotates depending on the position of the box.
• Crushing Blocks
The blocks move based on an array that tells a block to move after a period of time.
Lighting and Shaders
The environment shader doesn’t use any lights, and runs using textures. All “dynamic” lighting is actually rim lighting from a cubemap. As you can see, the shader has 3 variables. The first is a texture that’s been baked in Blender Cycles, but any baked texture will do. The second texture is the reflection texture. It’s a cube map also prerendered in Blender Cycles. The last variable indicates rim power. That is the power the reflection has over the material, whether it’s only on the edge or appears on the front as well. The lower the rim power, the stronger the reflection.