
PickPon is a wild player versus player arena battle game for 2-4 players.
Version control, Naming convention, Team management and communication
Setup local multiplayer and gameplay logic. Created in editor scripts to help other artists and designers
Setup main menu, character selection and UI
//Content
Controls game state, Spawn characters, Scoring system, Map Transition
Holds players information for map transitions
Input logic for MainMenu, Lobby and UI
Input logic for gameplay, general pawn logic
Other gameplay logic that might communicate with Game Mode or Pawn class
I scripted the local multiplayer system for 2-4 players, splitted screens gameplay. I started creating a lobby where players can join the local session by pressing "Start". The controller and pawn information gets stored in the Game Instance class for map transitions. After loading the gameplay level, Game Mode class retrieve that GI information and sets player pawns to their correct player controller, and set the conditions to start the match activating the camera Split-screen mode
The lobby system is composed by 3 Events. The "SpawnCharacter" event replaces an empty dummy pawn to a playable character pawn and assigns it to the controller which joined the session. "DespawnCharacter" does the opposite logic from "SpawnCharacter". "DespawnAllMenuCharacters" resets all the pawns to the dummy. It's triggered when players go back to the main menu or after a game match
To enable/disable the camera splitscreen in runtime I created a custom C++ class which allows scripting this functionality in Blueprints
This function runs when the match starts, it spawn player characters and assign them to their controllers, It also remove non active players and controllers
//.h
UFUNCTION(BlueprintCallable, meta = (WorldContext = "WorldObjectContext"))
static void SetCameraSplitscreen(bool bIsDisabled, UObject* WorldObjectContext);
//.cpp
void ASplitScreenController::SetCameraSplitscreen(bool bIsDisabled, UObject* WorldObjectContext)
{
if (!WorldObjectContext)
return;
UWorld* CurrentWorld = Cast(WorldObjectContext->GetWorld());
if (CurrentWorld)
{
CurrentWorld->GetGameViewport()->SetDisableSplitscreenOverride(bIsDisabled);
}
}
One of my favorite tasks was creating scripting tools to quickly create an crowd arena and 3D artists integrate directional light system with their shader inside the engine.
A simple script for Level Designers and Artist. Quickly create a circular crowd around the arena with customizable radius, scale and size parameters
A simple construction script that allowed 3D Artists to test their cell shader results on level