Game Mode, Camera
This commit is contained in:
		
										
											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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user