Gameplay Screenshots


Showcase
Singleplayer Showcase
Multiplayer Showcase
Highlighting
1. Gameplay Ability System
The core logic was referenced from the Lyra project.
Gameplay Ability Binding
The setup requires two structs.

The first struct determines which abilities are granted to the Gameplay Ability System. Each weapon grants or removes its abilities when the player swaps weapons. The same ability can also have different levels depending on the weapon.

The second struct binds Gameplay Tags to input actions.

These two functions are the core for binding abilities to the Enhanced Input Component.
BindNativeAction handles functionality outside the Gameplay Ability System, like character and camera movement.
BindAbilityActions handles the actual Gameplay Abilities that will be granted to the system.
Gameplay Ability Input

These two functions get bound to input actions using BindAbilityActions.
When the player presses an input button bound to a Gameplay Tag, AbilityInputTagPressed searches for the granted ability and adds it to InputPressedSpecHandle and InputHeldSpecHandle.
When the player releases the button, AbilityInputTagReleased searches for the ability, adds it to InputReleasedSpecHandle, and removes it from InputHeldSpecHandle. The AbilitySpecHandle also gets removed from InputPressedSpecHandle when the ability executes.
Gameplay Ability Execute

Now for how the ability activates. Abilities held in InputPressedSpecHandle and InputHeldSpecHandle get looped through and added to an AbilityToActivate array.

A for loop then activates all the abilities. InputReleasedSpecHandle only triggers after all valid abilities have been activated.
Gameplay Ability Base

The Gameplay Ability Base is the parent class for all gameplay abilities. It contains common functions for derived ability classes to grab necessary references.

Here is a list of the Gameplay Abilities I created for this project. Critical gameplay functionality and replication were handled inside these abilities. For more details, feel free to check the GitHub link.
2. Weapon

A WeaponInventoryComponent manages all weapon-related data. Each weapon is represented as a UObject called Weapon Instance. This component also handles switching between weapons.

A struct represents each weapon slot. There are four slots: Main Weapon, Secondary Weapon, Melee Weapon, and Throwable Weapon.
Weapon Instance

WWeapon Instance is a UObject that stores weapon data like max ammo and current ammo. Ammo is stored in a Gameplay Tag-based container. The Weapon Instance also tells the Gameplay Ability System which abilities should be granted for that weapon.

Inside the weapon inventory, Weapon Instance gets replicated so each client knows the weapon data.

Here are the example of how the Interface will be look like over the data table.
3. Match Rule System
Now for the match system and how it works.

Whenever a new player joins the host, the Game Mode assigns them to the team with fewer players. Players can also switch teams and add new AI to their team.

The Game State stores all team information and handles the actual logic for assigning players to teams.

It's also worth mentioning the Player State, which stores important player data like player name, current money, and player ID.

