Game Mode, Camera
This commit is contained in:
parent
9cf0e05c82
commit
4e4d26457d
3
.gitignore
vendored
3
.gitignore
vendored
@ -15,3 +15,6 @@ Project/.vsconfig
|
||||
*.target
|
||||
*.modules
|
||||
Project/.idea
|
||||
|
||||
Project/Saved/Screenshots
|
||||
*/Binaries/Win64/*.patch_*.*
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -55,6 +55,6 @@ public class Gasa : ModuleRules
|
||||
}
|
||||
#endregion Plugins
|
||||
|
||||
PublicIncludePathModuleNames.Add("Gasa");
|
||||
PublicIncludePaths.Add("Gasa");
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,8 @@
|
||||
#include "CoreMinimal.h"
|
||||
// #define private protected
|
||||
|
||||
class UCameraComponent;
|
||||
class UInputAction;
|
||||
struct FInputActionValue;
|
||||
class UInputMappingContext;
|
||||
class USpringArmComponent;
|
||||
|
2
Project/Source/Gasa/GasaGameMode.cpp
Normal file
2
Project/Source/Gasa/GasaGameMode.cpp
Normal file
@ -0,0 +1,2 @@
|
||||
#include "GasaGameMode.h"
|
||||
|
11
Project/Source/Gasa/GasaGameMode.h
Normal file
11
Project/Source/Gasa/GasaGameMode.h
Normal 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:
|
||||
};
|
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user