About

  • First person rogue-like with upgrading weapon system
  • Senior capstone game developed fall ‘21 - present
  • Developed in Unreal Engine 4.27 and Visual Studio
  • Automated builds using Jenkins and GCP
  • Team size: 7, Role: Gameplay & Systems Programmer

Repository: Github

Responsibilities

  • Co-lead programmer
  • FPS gun system
  • Fully upgradeable system with blueprint implementable mods based in C++
  • Enemy spawning systems
  • Deatailed technical documentation

Gun System

The gun system works similarly to that of a standard gun in that it holds logic to determine when to fire and when to reload. What makes this system stand out however is the why upgrades work into the rest of the system. Upgrades are based on a base class that has overidable functions for various events.

For example:


UFUNCTION(BlueprintNativeEvent)
void OnSpawn(ABullet* bullet);

UFUNCTION(BlueprintNativeEvent)
void OnFire(AGun* gun);

UFUNCTION(BlueprintNativeEvent)
void OnHit(AActor* hitActor, UWorld* world);

UFUNCTION(BlueprintNativeEvent)
void OnReload(AActor* player);

This allows for the various functions to be called at various times throughout the functions of the gun. Furtharmore, overrideing the functions through different subclasses allows for a multitude of different functionalities to be called using the same functions. Additionally, making all of the function Blueprint native events allows for these system to be implemented in Blueprint. Blueprint implementation allows for easier implementation of various feature like Niagara particle systems and sound effects and more importantly allows for some things to be implemented without Using C++ code.

One issue with this, however, is that because the mods are UObjects they dont have access to various functions in blueprint. To solve this problem I had to write custom functions to expose them to the Unreal blueprint editor:


UFUNCTION(BlueprintCallable)
AActor* GetActorOfClass_Internal(TSubclassOf<AActor> actorClass);

UFUNCTION(BlueprintCallable)
TArray<AActor*> GetActorsOfClass_Internal(TSubclassOf<AActor> actorClass);

UFUNCTION(BlueprintCallable)
UWorld* GetWorld_Internal();

UFUNCTION(BlueprintCallable)
UNiagaraComponent* SpawnSystemAtLocation_Internal( UNiagaraSystem* system, FVector location, FRotator rotation, FVector scale);

Trailer

Images

placeholder image 2 placeholder image 3 placeholder image 3 placeholder image 1 placeholder image 3

*Artwork done by Brittany Ollendieck and Jack Tenda