What is GRIM?

GRIM is a spooky narrative game based on a Taiwanese Folklore where you play as a ghost that can possess an arbitrary number of objects to help his undead twin to safety and craft your own story along the way.

My Role - Lead Gameplay Engineer

As the Lead Gameplay Engineer, I made many Technical Design decisions regarding the implementation of systems and mechanics in C++, project organization, and work delegation.

I was also responsible for implementing most of the systems and mechanics in C++, building a foundation for the project in C++, and extending it to the Designers in Blueprints in Unreal Engine 5.

My Work on GRIM

The Headings below are drop-downs!

Possession System

Our goal for the possession system was to let the player (as the ghost) possess an arbitrary number of objects in the world. To implement this I had 3 thoughts - 

Possession from a Corner Camera

Shimmy

Roll

Hop

Camera Manager and Feel

I made a custom Player Camera Manager for our Ghost Camera and Possessable Camera. This would give the player the feeling of being a ghost, guiding the twin, and getting frightened by the monsters.

Switching Camera Positions

Possession Transition

Twin Movement and Pickups

With the design decision made for the player to play as the Ghost from a corner camera perspective, we decided that a point-and-click mechanic to guide the twin would make a lot of sense. The player, when playing as the ghost

Picking Up an Item

Using a Key on a Door

Inventory System

I made an Inventory system that is used by Twin to pick up small, but useful objects like Keys, Notes, Laterns, etc.

Inventory Toggle
Event-Based UI using Subsystems

Input Handler and Player Controller

For Input, I built an Input Config data asset and an Input handler component for the Enhanced Input System in UE5. Which

Storage Component

The storage component can be added to any object in the scene, and it serves the functionality of being a Storable, or a Storage. While dropping or unhiding, A trace is performed around the object to make sure it is a valid place to place the object.

Twin Holds items to be carried around

Hiding and Un Hiding

Debugging

I do a ton of debugging using Visual Studio's debugger and breakpoints, which help me understand code flow and resolve errors.
And more importantly, visual debug draws and visual logging, for things like object placement and collision handling.
Below are a few examples

Box Traces while placing down a Vase

Debugging Shimmy Movement for Cabinet with Pivot Points for movement and Box traces for collision check