Steel Seraph

Lead Programmer | Character Controller | Unity
Check out the Repository

A cybernetically enhanced cowboy wakes from cryosleep atop a Corporate MEGA-tower in the distant future. Dazed but deadly, he is determined to survive endless waves of deadly enemies.

I had a great time working on this project but definitely had my fair share of troubles along the way! One of the aspects of this project I'm most proud of would be the physics character controller, as I strived to make a fully custom controller detached from Unity's rigid body system.

Besides the movement I was primarily in charge of task delegation (On the code side) and implementing the work of other disciplines. The game involves an AI system driven by Unity's Nav Mesh System, a weapon management system, a wave management system for handling the spawning and pathing of AI, and a movement system which managed player inputs and character movement.

My journey developing this character controller was an interesting one due to the fact I was rather inexperienced with vector maths and physics as a whole. Thanks to help from my professor Finn Morgan and a peer Thomas O'Brien I was able to complete my character controller free of Unity's physics library (Mostly).

Proof of concept of the movement system

At this point in development my focus was getting a playable controller in the hands of the Designers so they could map out levels and balance variables. The player could jump, double jump, slide and wall run and the collisions were handled by Unity's rigid body system.

Level I made to show off the full scope of movement

Not long after this I gutted the rigid body from the controller and used raycasts to drive the physics and collision handling. One of the biggest problems I had was the lack of a depenetration function. For the majority of the project I used a capsule raycast with the max length set to the players velocity x delta time. I would then clamp the position of the player to the hit's distance which should prevent the player from clipping into objects, oh how wrong I was.

Early beta level screenshot

Once the level started gaining more than primitive collision shapes I knew I couldn't rely entirely on my collision detection function to stop unwanted behaviors. This was evident by the player clipping and getting stuck on things throughout the scene every so often... I knew I needed to make this compatible with mesh colliders.

At this point I introduced a depenetration function which used a larger player capsule collider to fill an array of colliders to check against. I would then iterate through each collider in that array and check if the actual player's collider overlapped and if so calculate how far and what direction to move the player to resolve the collision. This method proved to fix just about every collision problem I was having up to this point.

Movement tutorial demo

In the end I've learnt so much from this project, I've learnt to effectively communicate with other team members to get tasks done, offer advice and give accurate job timeline estimations as lead programmer, and gathered a deeper understanding of the game development pipeline. I'm really excited to get started on my next project and put these new found skills to work!

Gameplay from final build :)