본문 바로가기
Unreal Engine/[UE4] RPG Project

1. 플레이어 컨트롤러에서 캐릭터 Input 입력 바인딩하기

by JJPearl 2022. 1. 10.
반응형

- 바인딩

  • Axis Mappings : 조이스틱 레버의 신호를 설정. 언리얼엔진은 레버가 중립이면 0, 끝위치에 있으면 설정된 스케일 값에 따라 1 or -1을 게임 로직에 전달. 내 코드에서는 A키를 누르면 -1 값이, D 키를 누르면 1 값이 발생
  • Action Mappings : 조이스틱 버튼의 신호를 설정. 버튼을 눌렀을 때와 뗄 때만 신호를 전달

 

 

언리얼 엔진의 입력 시스템은 중간에 플레이어 컨트롤러를 거쳐서 폰에 전달된다.

만약 플레이어 컨트롤러에 특정 입력을 처리하는 코드를 구현하면 해당 입력은 플레이어 컨트롤러에서 필터링 되어 폰에 더 이상 전달되지 않는다.

컨트롤러가 캐릭터 및 폰에 빙의되기 때문에 컨트롤러에서 바인딩 하고 폰에 적용하는 방식.

 

폰을 조종하는 입력 로직을 플레이어 컨트롤러에 구현하면 좋은 예

  • 멀티플레이어 게임에서 런타임에 서로의 캐릭터를 다이내믹 하게 바꾼다면 --> Input을 플레이어 컨트롤러에서 처리하는게 나을 것
  • 멀티플레이어 게임에서 만약 내 캐릭터가 죽고 새 pawn으로 리스폰 된다면 --> 입력은 pawn이 바뀌어도 유지되야 한다.
  • 네트워크 처리 할 때도 플레이어 컨트롤러에서 처리하는게 좋다고 한다(?)

 

-> 범용성, 확장성, 가독성 측면에서 플레이어 컨트롤러에서 인풋을 바인딩 하는게 좋은 것 같다

-> 플레이어 컨트롤러 공식 문서를 참고하자.

https://docs.unrealengine.com/4.27/ko/InteractiveExperiences/Framework/Controller/PlayerController/

 

플레이어 컨트롤러

PlayerController 는 플레이어에게 받은 입력을 이동, 아이템 사용, 무기 발사와 같은 동작으로 변환하는 함수성을 구현합니다.

docs.unrealengine.com

 

=> 플레이어 컨트롤에서 폰의 상하좌우 움직임, 점프 구현

 

※ IDEA

나중에 3개의 캐릭터에 대해 하나의 플레이어 컨트롤러를 사용한다고 생각하면(어차피 스킬키,움직임키 등 기획에서 똑같이 다 맞췄으니까) 캐릭터를 동적으로 어떻게 가져올 수 있을까? 가상 함수 오버라이딩으로 하나의 플레이어 컨트롤러를 사용해 각자 다른 동작을 하도록 만들면 좋을 것 같다

 

void AAdamPlayerController::SetupInputComponent()
{
	Super::SetupInputComponent();
	
	InputComponent->BindAxis(TEXT("MoveFB"), this, &AAdamPlayerController::MoveFB);
	InputComponent->BindAxis(TEXT("MoveLR"), this, &AAdamPlayerController::MoveLR);

}

void AAdamPlayerController::MoveFB(float NewAxisValue)
{
	ACharacter* const MyCharacter = GetCharacter();
	if (MyCharacter && NewAxisValue != 0.0f)
	{
		MyCharacter->AddMovementInput(MyCharacter->GetActorForwardVector(), NewAxisValue);
	}

}

void AAdamPlayerController::MoveLR(float NewAxisValue)
{
	ACharacter* const MyCharacter = GetCharacter();
	if (MyCharacter && NewAxisValue != 0.0f)
	{
		MyCharacter->AddMovementInput(MyCharacter->GetActorRightVector(), NewAxisValue);
	}
}

void AAdamPlayerController::Jump()
{
	ACharacter* const MyCharacter = GetCharacter(); // ACharacter 헤더의 Jump 멤버 함수를 쓰기 위해서 GetCharacter()
	if (MyCharacter)
	{
		MyCharacter->Jump();
	}
}

void AAdamPlayerController::StopJumping()
{
	ACharacter* const MyCharacter = GetCharacter();
	if (MyCharacter)
	{
		MyCharacter->StopJumping();
	}
}

 

 

- InputComponent : 입력 설정을 처리하기 위한 언리얼 오브젝트. BindAxis() / BindAction() 두 가지 함수 제공

- SetupInputComponent() : InputComponent 사용해 폰의 멤버 함수와 입력 설정을 바인딩 하는 곳.

- AddMovementInput() : 폰 무브먼트 컴포넌트의 함수. -1~1사이 입력값을 폰 무브먼트 컴포넌트에 전달해서 폰을 움직이게 만드는 함수.

이동할 방향을 월드 좌표계를 기준으로 하는 방향 벡터 데이터로 지정해야 한다.

- GetActorForwardVector() : 월드 좌표계 기준으로 액터의 전진 방향 벡터 데이터

 

 

 

반응형