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

2. 언리얼엔진의 PlayerCameraManager / 캐릭터 회전(ControlRotation)

by JJPearl 2022. 1. 11.
반응형

PlayerCameraManager

[출처] 언리얼엔진4 공식 카페
게임 플레이가 시작되면 언리얼 엔진은 플레이어의 화면을 담당할 플레이어 카메라 관리자(PlayerCameraManager)를 만든다.
이 관리자는 플레이어의 모니터 화면을 보여줄 카메라를 관리하며 애니메이션에 활용할 임시 용도로 사용할 카메라 액터를 별도로 보관해두고 있다. 이 카메라 관리자를 담당하는 액터가 바로 플레이어 컨트롤러이다.
플레이 버튼을 누른 후 월드 아웃라이너에서 이들을 확인해보면 아래 그림과 같이 PlayerCameraManager 액터와 CameraActor 액터도 생성된 것을 볼 수 있는데 이를 총괄하는 액터가 바로 플레이어 컨트롤러다. 
플레이시 생성되는 카메라 관련 액터들. 이것들을 관리하는건 플레이어 컨트롤러.
 
플레이어 컨트롤러가 폰에 빙의하면 플레이어 컨트롤러는 플레이어 카메라 관리자에게 지금 빙의한 폰이 앞으로 플레이어의 모니터 화면을 담당할 액터라고 알려준다.
이렇게 플레이어의 모니터 화면을 담당할 액터를 별도로 뷰 타겟(View Target)이라고도 한다.
플레이어 카메라 관리자에 뷰 타겟이 지정되면 플레이어 카메라 관리자 뷰 타겟에 카메라 컴포넌트가 있는지 검색하고 카메라 컴포넌트가 발견되면 그 카메라 설정으로 플레이어의 모니터에 결과 화면을 뿌려준다.
만일 카메라 컴포넌트가 발견되지 않으면 그냥 뷰 타겟 액터 위치에서 기본 카메라로 화면을 뿌린다. 
플레이어의 모니터 화면을 담당하는 담당하는 액터에 뷰 타겟(View Target)이라는 이름을 별도로 붙이는 이유는 카메라 컴포넌트를 가지고 있는 액터면 폰이 아니라도 누구나 뷰 타겟이 될 수 있도록 입력과 출력의 시스템이 분리되어 있기 때문.
플레이어 컨트롤러가 폰에 빙의하면 자동으로 그 폰에서 입력과 출력을 담당하는데, 우리가 필요하면 별도의 뷰 타겟만 다른 액터로 설정하는 것이 가능하다. 

뷰 타겟의 개념

 

커스텀 플레이어 카메라 매니저를 생성해서 플레이어 컨트롤러에서 Set 해줄수도 있다.

추후 3인칭-1인칭 카메라 시점 변경을 위해 커스텀 플레이어 카메라 매니저를 생성해놓은 상태이다.

AAdamPlayerController::AAdamPlayerController()
{
	PlayerCameraManagerClass = AAdamPlayerCameraManager::StaticClass();
}

 

카메라의 상하 회전 각도를 제한(카메라가 바닥까지 닿지 않도록) 하기 위해 플레이어 카메라 매니저 생성자에서 플레이어 카메라 매니저의 ViewPitchMax, ViewPitchMin 값을 제한해 주었다.

 
 

https://unrealcommunity.wiki/player-camera-manager-227ae5

 

Player Camera Manager | Unreal Engine Community Wiki

The PlayerCameraManager is an important aspect of Unreal Engine and good documentation around it is somewhat sparse. This page exists to try and remedy that.

unrealcommunity.wiki

 

 

 

 


 

 

캐릭터의 회전

플레이어 컨트롤러는 플레이어와 1:1로 매칭돼 주로 게임의 물리적 요소를 고려하지 않은 플레이어의 의지(즉, 컨트롤)에 관련된 데이터를 관리한다. 

(반면 폰은 게임에서 물리적 제약을 갖기 때문에 현재 캐릭터가 처한 물리적 상황을 관리)

예)

폰이 관리하는 속성: 속도

플레이어 컨트롤러가 관리하는 속성: 컨트롤 회전(Control Rotation)

-> 컨트롤 회전을 활용해 마우스 움직임에 따라 폰이 회전하도록

 

  1. 마우스 상하좌우 움직임은 Turn,LookUp 축 입력 설정 후 바인딩해 받아온다.
  2. Turn : Z축 회전 / LookUp : Y축 회전
  3. 해당 입력값에 따라 캐릭터가 회전하도록 AddControllerInputYaw/Roll/Pitch
    • 이 함수는 마우스 입력 신호 값을 플레이어 컨트롤러의 컨트롤 회전 값으로 변환
    • 언리얼 엔진의 캐릭터는 기본적으로 컨트롤 회전의 Yaw회전(Z축 회전) 값과 폰의 Yaw 회전이 서로 연동되어 있기 때문에 마우스를 좌우로 움직일 때 캐릭터가 같이 Z축으로 회전한다.
      • bUseControllerRotationYaw = false;
      • 캐릭터가 마우스를 따라 회전하지 않도록 하려면 캐릭터 생성자에 해당 코드를 추가하면 된다.

마우스 따라 카메라 회전. 상하좌우 이동과 마찬가지로 플레이어 컨트롤러에 구현했다.

 

  • 캐릭터 이동 : 캐릭터가 현재 보는 시점(카메라 방향)을 기준으로 상하좌우 방향으로 움직임. 카메라는 회전하지 않음.
    • 캐릭터의 이동 방향인 FVector 값을 얻기위해 컨트롤 회전(FRotator) 데이터를 이용.
    • 액터의 회전값 (0,0,0) = 그액터가 바라보는 방향이 월드의 X축 방향 (1,0,0)임을 의미
      --> 월드 X축 방향 == 기본 회전 값에 대응하는 방향 값
    • 스프링 암의 회전값 = 컨트롤 회전 값 = 카메라가 바라보는 방향
      • 컨트롤 회전값으로 회전 행렬 생성 후 원하는 방향 축을 대입해 캐릭터가 움직일 방향 값 가져옴
      • FRotationMatrix(GetControlRotation()).GetUnitAxis(EAxis::방향축)
    • 언리얼 엔진에서 시선 방향은 X축, 우측 방향은 Y축

컨트롤 회전 값으로 부터 벡터 값 가져오는 코드

 

근데 여기서 문제가 생긴다.

마우스를 위로 올리면 카메라는 캐릭터의 위에서 아래를 바라보게 된다. 이때 앞으로 움직이는 키를 누른다면?

카메라 방향(x축)을 따라 움직이도록 구현했기 때문에 바닥과 충돌하면서 느리게 이동하는 문제가 발생한다.

따라서 회전 행렬을 ControlRotation의 Yaw 값만 이용하는 FRotator를 활용해 만들면 문제가 해결된다.

컨트롤 회전의 Yaw값만 이용해 카메라 방향 기준으로 이동하는 코드

 

 

 

  • 캐릭터 회전 : 캐릭터가 이동하는 방향으로 메쉬가 회전함 
    • GetCharacterMovement()->bOrientRotationToMovement = true;
      • 캐릭터 무브먼트 컴포넌트의 기능. 캐릭터가 움직이는 방향으로 캐릭터를 자동으로 회전시켜줌.
    • GetCharacterMovement()->RotationRate = FRotator(0.0f,720.0f,0.0f);
      • 회전 속도를 지정해 캐릭터가 부드럽게 회전하도록.
반응형