PawnMoveMent를 부모로 클래스 생성
Collider 클래스에서 ColliderMovement 클래스를 사용할 준비
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Pawn.h"
#include "Collider.generated.h"
UCLASS()
class BASIC_API ACollider : public APawn
{
GENERATED_BODY()
public:
// Sets default values for this pawn's properties
ACollider();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
UPROPERTY(VisibleAnywhere, Category = "Mesh")
class UStaticMeshComponent* MeshComponent;
UPROPERTY(VisibleAnywhere, Category = "Mesh")
class USphereComponent* SphereComponent;
UPROPERTY(VisibleAnywhere, Category = "Mesh")
class UCameraComponent* Camera;
UPROPERTY(VisibleAnywhere, Category = "Mesh")
class USpringArmComponent* SpringArm;
UPROPERTY(VisibleAnywhere, Category = "Movement")
class UColliderMovement* OurMovementComponent;
virtual UPawnMovementComponent* GetMovementComponent() const override;
FORCEINLINE UStaticMeshComponent* GetMeshComponent() { return MeshComponent; };
FORCEINLINE void SetMeshComponent(UStaticMeshComponent* Mesh) { MeshComponent = Mesh; }
FORCEINLINE USphereComponent* GetSphereComponent() { return SphereComponent; };
FORCEINLINE void SetSphereComponent(USphereComponent* Sphere) { SphereComponent = Sphere; }
FORCEINLINE UCameraComponent* GetCameraComponent() { return Camera; };
FORCEINLINE void SetCameraComponent(UCameraComponent* cam) { Camera = cam; }
FORCEINLINE USpringArmComponent* GetSpringArmComponent() { return SpringArm; };
FORCEINLINE void SetSpringArmComponent(USpringArmComponent* spring) { SpringArm = spring; }
private:
void MoveForward(float input);
void MoveRight(float input);
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "Collider.h"
#include <Engine/Classes/Components/SphereComponent.h>
#include <Engine/Classes/Components/StaticMeshComponent.h>
#include <Engine/Classes/Components/InputComponent.h>
#include <Engine/Classes/GameFramework/SpringArmComponent.h>
#include <Engine/Classes/Camera/CameraComponent.h>
#include <UObject/ConstructorHelpers.h>
#include "ColliderMovement.h"
// Sets default values
ACollider::ACollider()
{
// Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
//RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));
SphereComponent = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComponent"));
//SphereComponent->SetupAttachment(GetRootComponent());
SetRootComponent(SphereComponent);
SphereComponent->InitSphereRadius(40.0f);
SphereComponent->SetCollisionProfileName(TEXT("Pawn"));
MeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MeshComponent"));
MeshComponent->SetupAttachment(GetRootComponent());
static ConstructorHelpers::FObjectFinder<UStaticMesh> MeshComponentAsset(TEXT("StaticMesh'/Game/StarterContent/Shapes/Shape_Cone.Shape_Cone'"));
if (MeshComponentAsset.Succeeded())
{
MeshComponent->SetStaticMesh(MeshComponentAsset.Object);
MeshComponent->SetRelativeLocation(FVector(0.f, 0.f, -40.f));
MeshComponent->SetWorldScale3D(FVector(0.8f, 0.8f, 0.8f));
}
AutoPossessPlayer = EAutoReceiveInput::Player0;
SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
SpringArm->SetupAttachment(GetRootComponent());
SpringArm->SetRelativeRotation(FRotator(-45.f, 0.f, 0.f));
SpringArm->TargetArmLength = 400.f;
SpringArm->bEnableCameraLag = true;
SpringArm->CameraLagSpeed = 3.0f;
Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
Camera->SetupAttachment(SpringArm, USpringArmComponent::SocketName);
OurMovementComponent = CreateDefaultSubobject<UColliderMovement>(TEXT("OurMovementComponent"));
OurMovementComponent->UpdatedComponent = RootComponent;
}
// Called when the game starts or when spawned
void ACollider::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void ACollider::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
// Called to bind functionality to input
void ACollider::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAxis(TEXT("MoveForward"), this, &ACollider::MoveForward);
PlayerInputComponent->BindAxis(TEXT("MoveRight"), this, &ACollider::MoveRight);
}
void ACollider::MoveForward(float input)
{
FVector Forward = GetActorForwardVector();
if (OurMovementComponent)
{
OurMovementComponent->AddInputVector(Forward * input);
}
}
void ACollider::MoveRight(float input)
{
FVector Right = GetActorRightVector();
if (OurMovementComponent)
{
OurMovementComponent->AddInputVector(Right * input);
}
}
UPawnMovementComponent* ACollider::GetMovementComponent() const
{
return OurMovementComponent;
}
Movement 클래스 내부 작성
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/PawnMovementComponent.h"
#include "ColliderMovement.generated.h"
/**
*
*/
UCLASS()
class BASIC_API UColliderMovement : public UPawnMovementComponent
{
GENERATED_BODY()
public:
virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "ColliderMovement.h"
void UColliderMovement::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
if (!PawnOwner || !UpdatedComponent || ShouldSkipUpdate(DeltaTime))
{
return;
}
FVector DesiredMovementThisFrame = ConsumeInputVector().GetClampedToMaxSize(1.0f);
if (!DesiredMovementThisFrame.IsNearlyZero())
{
FHitResult Hit;
SafeMoveUpdatedComponent(DesiredMovementThisFrame, UpdatedComponent->GetComponentRotation(),true, Hit);
if (Hit.IsValidBlockingHit())
{
SlideAlongSurface(DesiredMovementThisFrame, 1.f - Hit.Time, Hit.Normal, Hit);
}
}
}