A 3D Action Metroidvania with Souls-Like and Fighting Game Elements

A collaborative project built by a team of four for the Metroidvania Game Jam in three months. The project was spearheaded by me as project lead and lead developer. The goal of the project was to not only create a game but also a foundation of interconnected systems and tools that we thought were practical for scalability and constant active development.

This experience underscored my capacity to lead and coordinate effectively in time-sensitive and creative projects.

Features Implemented

  • Custom 3D Physics and spline-based character controller.

  • Custom spline tool for level building and character locomotion.

  • Custom modular frame-based combat system.

    • Attacks and combos are customizable and defined using scriptable objects.

    • Buffered input reading for motion-based action.

    • Hitbox and hurtbox editor tools.

  • Data-driven Inventory, quick slots, and Interactive item system.

  • World and Game state management.

  • Player HUD and framework for UI Systems.

  • Particle systems and shaders.

  • 3D and lighting optimization.

  • Level design and building.

  • Integrated FMOD as the game’s audio backend for voice lines, SFX, and adaptive music.

  • Persistent scene loading system via additive scene loads.

  • Implemented behaviour-tree-based enemy AI.

  • Save and Load system for game state and player settings.

    • Save files are binary encrypted with Odin Serializer.

  • Integrated a dialogue system using YarnSpinner.

  • Input buffering system.

Tools and Libraries Used

  • DoTween

  • Odin Inspector and Serializer

  • FMod

  • CineMachine

  • Final IK

  • YarnSpinner

  • Behaviour Designer

White : Memories



Character locomotion on splines, stair case handling, and camera system.

Demo of buffered inputs and input reading for special actions.

Demo of various UI elements and menus.

Creating Attacks

All attacks are defined in scriptable objects and are customizable with the exposed properties. Here designers can quickly create, modify, and test various combat mechanics with a simple drag-and-drop motion.

At its core, attacks are assigned an animation, hitbox identifier, and a set of defined frames. When an attack is triggered; The attack animation is played and fires off the hitbox at the set range of frames in relation to the animation being played.

Combat System Breakdown



Editable attack data from Inspector

Editable attack data from Inspector.

Hitbox editing with animation preview tool.

Sequences can defined using drop-down selections .

Hitboxes and Hurtboxes

Hitboxes and Hurtboxes are handled by manager components that automatically collects and stores references to child hitbox components of an entity. These managers are called upon by the host entity using the attack scriptable object and sets the active states of the requested hitbox.

Hitboxes can be easily configurable to adjust for size and be correctly lined up with specific animations using an animation preview tool we created.

Buffered Inputs and Input Reading

To create a more responsive gameplay experience for the player; attacks and actions are buffered if they are inputted at a specified window of time/frames. All inputs from the controller are recorded temporarily when pressed with an included timestamp. If the timestamp matches the allotted time, the next possible action is queued to be performed if possible.

Using the same technique, we also created a system that can read a sequence of inputs to perform special attacks. This mechanic is similar to what can be found in modern fighting games. By pressing the D-PAD in a specific pattern and then following up with an attack button, a search is conducted to find an attack data that matches the exact sequence.

Forming Pathways

To simulate 2D movement in 3D, we used Catmull-Rom splines as the basis for the pathway for entities to traverse across. We found that this formulation was the most convenient and optimal solution for our use case. With each segment being locally influenced by direct neighbors, we could simply place control points along collider surfaces with a ray cast to form a path.

Character Controller and 2D Locomotion in 3D with Splines



Points placed along surfaces form the splines.

Spline Walking

Entities that are enabled to walk along the splines have their position updated to the nearest point on the spline that they are attached to. The entity’s forward vector is also then updated to match the tangent of the nearest point. With both, its orientation and position aligned with the spline, a force can be directly applied to the entity’s forward vector to move it along the spline path. To move it backward, we flip the mesh 180 degrees and apply a negative force along its forward vector.

Stairs and Slope Case Handling

Characters have floating capsule colliders and are never in direct contact with the ground. A ray cast is shot down from the bottom as a ground check for any surfaces. If a surface is found, an upward force is applied from the point of contact to the capsule, keeping it afloat. Inverse kinematics are then applied to the legs to visually ground them correctly.

This solution circumvents the issue of going over uneven terrains such as stairs or sloped terrains with physics-based controllers.