본문 바로가기

언리얼게임프로젝트/TPS C++

플레이어 이동 컴포넌트 제작

이전에 만든 PlayerBaseComponent를 부모로 PlayerMoveComponent C++ 클래스를 생성합니다.

이렇게 만들어진 PlayerMoveComponent 컴포넌트를 플레이어 액터에 붙여주겠습니다.

TPSPlayer.h public:에 playerMove 포인트변수 추가

	UPROPERTY(VisibleAnywhere, Category = "Component")
	class UPlayerBaseComponent* playerMove;

 UPlayerMove클래스를 생성해 이 playerMove변수에 할당해 주겠습니다.

TPSPlyaer.cpp에 PlayerMoveComponet.h를 인클루드해주고

#include "PlayerMoveComponent.h"

생성자 맨 아래 CreateDefaultSubObject()함수를 이용합니다.

	playerMove = CreateDefaultSubobject<UPlayerMoveComponent>(TEXT("PlayerMove"));

TPSPlayer.cpp 에 playerMove->SetupInputBinding(PlayerInput); 를 추가합니다.

void ATPSPlayer::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);
	auto PlayerInput = CastChecked<UEnhancedInputComponent>(PlayerInputComponent);
	if (PlayerInput)
	{
		playerMove->SetupInputBinding(PlayerInput);

 

카메라 회전처리기능 옮기기

TPSPlayer.h헤더의 is_LookUp과 is_Turn과 Turn(), LookUP()함수 선언을 Ctrl-X PlayerMoveComponent.h public: 로 옮깁니다.

#pragma once

#include "CoreMinimal.h"
#include "PlayerBaseComponent.h"
#include "PlayerMoveComponent.generated.h"

/**
 * 
 */
UCLASS()
class TPS_API UPlayerMoveComponent : public UPlayerBaseComponent
{
	GENERATED_BODY()
public:
	UPlayerMoveComponent();

	UPROPERTY(EditDefaultsOnly, Category = "Input")
	class UInputAction* ia_LookUp;

	UPROPERTY(EditDefaultsOnly, Category = "Input")
	class UInputAction* ia_Turn;

	void Turn(const struct FInputActionValue& inputValue);

	void LookUp(const struct FInputActionValue& inputValue);

	virtual void SetupInputBinding(class UEnhancedInputComponent* PlayerInput) override;
};

cpp의 구현부도 TPSPlayer.cpp에서 짤라서 PlayerMoveComponent.cpp로 옮겨주고 UPlayerMoveComponent::를 변경해줍니다. EnahncedInput을 위한 헤더도 추가해줍니다.

내친김에 Input_Action들도 FObjectFinder()를 이용해 연결해줍니다. 위치는 각자 다르므로 Input_Action을 Ctrl+C해서 복사해 옵니다. static을 사용합니다.

#include "PlayerMoveComponent.h"
#include "EnhancedInputComponent.h"
#include "InputAction.h"

UPlayerMoveComponent::UPlayerMoveComponent()
{
	static ConstructorHelpers::FObjectFinder<UInputAction> iaTurn(TEXT("InputAction'/Game/Input/IA_Turn.IA_Turn'"));
	if (iaTurn.Succeeded())
	{
		ia_Turn = iaTurn.Object;
	}
	static ConstructorHelpers::FObjectFinder<UInputAction> iaLookUp(TEXT("InputAction'/Game/Input/IA_LookUP.IA_LookUP'"));
	if (iaLookUp.Succeeded())
	{
		ia_LookUp = iaLookUp.Object;
	}
}

void UPlayerMoveComponent::SetupInputBinding(class UEnhancedInputComponent* PlayerInput)
{

	PlayerInput->BindAction(ia_Turn, ETriggerEvent::Triggered, this, &UPlayerMoveComponent::Turn);
	PlayerInput->BindAction(ia_LookUp, ETriggerEvent::Triggered, this, &UPlayerMoveComponent::LookUp);
}

void UPlayerMoveComponent::Turn(const FInputActionValue& inputValue)
{
	float value = inputValue.Get<float>();
	me->AddControllerYawInput(value);
	//PRINT_LOG(TEXT("%f"),value)
}

void UPlayerMoveComponent::LookUp(const FInputActionValue& inputValue)
{
	float value = inputValue.Get<float>();
	me->AddControllerPitchInput(value);
	//PRINT_LOG(TEXT("%f"), value)
}

컴파일후 BP_TPSPlayer를 열어보면 PlayerMove 컴포넌트가 추가되었고 InputAction변수

InputAction변수가 잘 지정되었는지 확인합니다.