Guilherme Oliveira

Guilherme de Oliveira

Gameplay Programmer

Paragon Shooter

Project Type: Gameplay Practice Project
Engine: Unreal
Languages: C++, Blueprints

During my free time I enjoy practicing and prototyping Gameplay Mechanics, this way I can always be improving and seeing different challenges that can come up in this job. I enjoy taking high quality assets and putting things together, adding the design and code part of the equation to it - in this example, I'm using one Paragon character (Lt. Belica) to create some gameplay mechanics and systems, my intention in the future is to also add an ability system to improve gameplay and have other characters from Paragon.

The Challenge I'm imposing to myself is getting something that was made for a game, in this case, Paragon, and how I can adapt it to another type of game and putting all these things together. Another point is practicing with high quality assets and animations, trying to create an experience as close as possible of how it would be in the industry.

This game has a very simple concept: fight against waves of enemies that gets harder and harder, until eventually you lose! Besides the shooting and simple AI, there are some things I would like to explore though, these things are:

To have progress in this project, I'm simulating a designer/developer workflow where I first try behaviors in Blueprints until I have a general grasp of what I want and how to do it, after that I code the structure in C++ and expose variables or implementable functions for Blueprints.

The Character has only two aiming states at the moment.

  • Gun Down: Camera is farther away, recoil is stronger.
  • Aiming: Camera is closer, higher precision and less recoil.

UENUM(BlueprintType)
enum class EShootingState : uint8 {
  ESS_GunDown UMETA(DisplayName="GunDown"),
  ESS_Aiming  UMETA(DisplayName="Aiming"),
  ESS_Max     UMETA(DisplayName="DefaultMax")
};
                        

States transitions:

void AShooterCharacter::StartAiming() {
  SetCharacterCurrentState(EShootingState::ESS_Aiming);
  pSpringArmComponent->SocketOffset = AimingSpringArmOffset;
}

void AShooterCharacter::StopAiming() {
  SetCharacterCurrentState(EShootingState::ESS_GunDown);
  pSpringArmComponent->SocketOffset = OriginalSocketOffset;
}
                        

Above you can see part of the blueprint prototyping for the recoil functionality, and in the image below you can see how it looks like when you try to shoot without moving your mouse at all.