Game Mode, Camera

This commit is contained in:
Edward R. Gonzalez 2024-04-12 19:55:34 -04:00
parent 6e06627910
commit 99a3e46635
17 changed files with 92 additions and 26 deletions

3
.gitignore vendored
View File

@ -15,3 +15,6 @@ Project/.vsconfig
*.target
*.modules
Project/.idea
Project/Saved/Screenshots
*/Binaries/Win64/*.patch_*.*

View File

@ -3,6 +3,7 @@
[/Script/EngineSettings.GameMapsSettings]
GameDefaultMap=/Game/Levels/StartupMap.StartupMap
EditorStartupMap=/Game/Levels/StartupMap.StartupMap
GlobalDefaultGameMode=/Game/Core/Game/BP_GameMode.BP_GameMode_C
[/Script/WindowsTargetPlatform.WindowsTargetSettings]
DefaultGraphicsRHI=DefaultGraphicsRHI_DX12

Binary file not shown.

Binary file not shown.

BIN
Project/Content/Core/Game/BP_GameMode.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Project/Content/Levels/StartupMap.umap (Stored with Git LFS)

Binary file not shown.

View File

@ -1,11 +1,41 @@
#include "GasaCharacter.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "GameFramework/SpringArmComponent.h"
AGasaCharacter::AGasaCharacter()
{
PrimaryActorTick.bCanEverTick = false;
UCharacterMovementComponent*
Movement = GetCharacterMovement();
Movement->bOrientRotationToMovement = true;
Movement->bConstrainToPlane = true;
Movement->bSnapToPlaneAtStart = true;
Movement->RotationRate = FRotator(0.0, 400.f, 0.0);
bUseControllerRotationPitch = false;
bUseControllerRotationRoll = false;
bUseControllerRotationYaw = false;
USceneComponent* root_component = GetRootComponent();
USkeletalMeshComponent* mesh = GetMesh();
CamSpringArm = CreateDefaultSubobject<USpringArmComponent>("Camera Spring Arm");
CamSpringArm->SetupAttachment(root_component);
CamSpringArm->SetRelativeRotation( FQuat::MakeFromEuler(FVector(0.0, -35.0, 0.0)));
CamSpringArm->TargetArmLength = 400.0f;
CamSpringArm->bInheritPitch = false;
CamSpringArm->bInheritYaw = false;
CamSpringArm->bInheritRoll = false;
Camera = CreateDefaultSubobject<UCameraComponent>("Camera");
Camera->SetupAttachment(CamSpringArm);
Weapon = CreateDefaultSubobject<USkeletalMeshComponent>("Weapon");
Weapon->SetupAttachment(GetMesh(), FName("WeaponAttach"));
Weapon->SetupAttachment(mesh, FName("WeaponAttach"));
Weapon->SetCollisionEnabled(ECollisionEnabled::NoCollision);
}

View File

@ -1,5 +1,6 @@
#pragma once
#include "GasaCommon.h"
#include "GameFramework/Character.h"
#include "GasaCharacter.generated.h"
@ -9,6 +10,14 @@ class GASA_API AGasaCharacter : public ACharacter
{
GENERATED_BODY()
public:
#pragma region Camera
UPROPERTY(EditAnywhere, Category="Camera")
UCameraComponent* Camera;
UPROPERTY(EditAnywhere, Category="Camera")
USpringArmComponent* CamSpringArm;
#pragma endregion Camera
#pragma region Combat
UPROPERTY(EditAnywhere, Category="Combat")
TObjectPtr<USkeletalMeshComponent> Weapon;

View File

@ -55,6 +55,6 @@ public class Gasa : ModuleRules
}
#endregion Plugins
PublicIncludePathModuleNames.Add("Gasa");
PublicIncludePaths.Add("Gasa");
}
}

View File

@ -2,6 +2,8 @@
#include "CoreMinimal.h"
// #define private protected
class UCameraComponent;
class UInputAction;
struct FInputActionValue;
class UInputMappingContext;
class USpringArmComponent;

View File

@ -0,0 +1,2 @@
#include "GasaGameMode.h"

View File

@ -0,0 +1,11 @@
#pragma once
#include "GameFramework/GameMode.h"
#include "GasaGameMode.generated.h"
UCLASS(Blueprintable)
class GASA_API AGasaGameMode : public AGameMode
{
GENERATED_BODY()
public:
};

View File

@ -11,6 +11,11 @@ AGasaPlayerController::AGasaPlayerController()
void AGasaPlayerController::Move(FInputActionValue const& ActionValue)
{
APawn* pawn = GetPawn<APawn>();
if (pawn == nullptr )
return;
// Note(Ed): I did the follow optimization for practice, they are completely unnecessary for this context.
#if 0
FVector2D AxisV = ActionValue.Get<FVector2D>();
FRotator ControlRot = GetControlRotation();
@ -19,31 +24,31 @@ void AGasaPlayerController::Move(FInputActionValue const& ActionValue)
FVector FwdDir = FRotationMatrix(YawRot).GetUnitAxis(EAxis::X);
FVector RightDir = FRotationMatrix(YawRot).GetUnitAxis(EAxis::Y);
APawn* Pawn = GetPawn<APawn>();
if (Pawn)
{
Pawn->AddMovementInput(FwdDir, AxisV.Y);
Pawn->AddMovementInput(RightDir, AxisV.X);
}
PPawn->AddMovementInput(FwdDir, AxisV.Y);
PPawn->AddMovementInput(RightDir, AxisV.X);
#else
FVector2f AxisV = FVector2f(ActionValue.Get<FVector2D>());
FQuat // FQuat isomorphic to FRotor (Hypothetical Def)
ControlRotor = GetControlRotation().Quaternion();
FQuat4f // FQuat isomorphic to FRotor (Hypothetical Def)
ControlRotor = FQuat4f(GetControlRotation().Quaternion());
// ControlRotor.Normalize(); // The Quaternion should always be a versor with UE...
FQuat4f
YawRotor = FQuat4f(FVector3f::UpVector, ControlRotor.GetAngle());
FVector3f HorizontalForward = ControlRotor.RotateVector(FVector3f::ForwardVector);
// HorizontalForward.Normalize();
// TODO(Ed): Profile which is faster just to know... (atan2 vs FindBetweenVectors)
// HorizontalForward.Z = 0;
// FQuat4f
// YawRotor = FQuat4f::FindBetweenVectors(FVector3f::ForwardVector, HorizontalForward);
// YawRotor.Normalize(); // The Quaternion should always be a versor with UE...
FVector3f FwdDir = YawRotor.RotateVector(FVector3f::ForwardVector);
FVector3f RightDir = YawRotor.RotateVector(FVector3f::RightVector);
// Need only one axis of rotation so this might be a possible optimization
float YawAngle = FMath::Atan2(HorizontalForward.Y, HorizontalForward.X);
FQuat4f YawRotor = FQuat4f(FVector3f::UpVector, YawAngle);
APawn* PPawn = GetPawn<APawn>();
if (PPawn)
{
PPawn->AddMovementInput(FVector(FwdDir), AxisV.Y);
PPawn->AddMovementInput(FVector(RightDir), AxisV.X);
}
// Rotate the combined input by the yaw rotor to get the movement direction
FVector MoveDir = (FVector) YawRotor.RotateVector( FVector3f(AxisV.Y, AxisV.X, 0.f));
pawn->AddMovementInput( MoveDir );
#endif
}