Game Mode, Camera
This commit is contained in:
		| @@ -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