본문 바로가기

언리얼엔진

10. PlayerController / Game Mode Base

Tip!

Win + 1 2 3 숫자키 : 하단 작업표시줄에 켜놓은 프로그램 순서대로 나옴


Rotator란?

Rotator노드

회전을 표현하는 개체이다. 사원수 회전의 내용을 랩핑한 내용으로, 결과값을 Dgree로 반환해준다.

※ 사원수 회전을 자세히 알아보면 너무 복잡해지므로 대충 그런게 있다는 것만 알아두자.

 

ViewTarget

- Controller로 Pawn을 조종하지만, 카메라의 시점은 따로 지정한 곳에서 cctv처럼 볼 수 있게 만들 수 있음.


PlayerController 설정하기

저번에는 BP_Player에서 캐릭터를 조종하는 로직을 만들었다.

하지만 PlayerController를 통해서 여러개의 캐릭터를 바꿔가며 조작할 수 있게 만들껀데, 그래서 Controller 자체에서

캐릭터를 조종할 수 있는 로직을 가지고 있도록 수정할 것이다.

 

따라서 BP_Player에서 만들었던 로직을 BP_PlayerController로 옮겨온다.

BP_PlayerController 이벤트그래프에 그대로 옮겨온 노드

BP_Player에서 Camera를 받아와 WorldRotation Z축을 뽑아와 사용했던 것을 추가해주어야하고,

LookLR/UD에서는 Controller의 Yaw/Pitch를 받아왔던 것도 추가해주어야 한다.

 

LookLR/UD에서는 Add Controller Yaw/Pitch Input을 사용했었다.

Add Controller Yaw/Pitch Input은 Pawn이 Controller에게 Yaw/Pitch를 추가해주는 것이다.

하지만 PlayerController로 건너온 지금은 Pawn을 거칠 필요가 없기에, Add Yaw/Pitch Input노드를 사용해주면 됩니다.

Add Yaw/Pitch Input 연결해주기


다음으로 Camera의 Rotation을 받아와야하는데, PlayerController에는 Camera컴포넌트가 따로 없습니다.

이제 PlayerController에서 Camera를 다룰 것이기 때문에 Player Camera Manager를 받아옵니다.

(BP_PlayerController의 클래스 디폴트를 보면 Player Camera Manager Class를 다루고 있습니다.)

Player Camera Manager를 받아와서 Camera의 Rotation Z축을 뽑아씁니다.

 

이후에 Add Movement Input에서 에러가 발생하는 문제가 있습니다.

이는 Add Movement Input에서 타깃이 self로 되어있는데, PlayerController에서 타깃을 self로 받으면 actor로 받지만

타깃을 Pawn으로 받아오고 있기 때문입니다.

에러 발생

따라서 Get Controlled Pawn 노드를 통해 PlayerController가 실행되고 Possess한 Pawn을 받아올 수 있습니다.

이제 아래와 같이 Get Controlled Pawn노드를 각각의 타깃에 연결해주고 다시 컴파일하면 정상적으로 돌아옵니다.

컴파일 성공!

이렇게하여서 BP_PlayerController에 로직을 옮겨오는데에 성공했습니다.

(기존에 BP_Player에 있던 로직은 그냥 삭제해주면 됩니다.)


Game Mode Base 사용하기

컴파일 후 실행해보면 아마 캐릭터가 움직이지 않을 것입니다.

BP_PlayerController를 만들어놨지만, 아직 Player에 적용하지 않았기 때문인데요.

이를 적용해주기 위해서 레벨에서 콘텐츠브라우저 - 콘텐츠/BluePrints폴더 안에 새 블루프린트클래스를 만들어 줍니다.

Game Mode Base를 선택하여 추가해줍니다(BP_GameMode).

Game Mode Base 추가


Game Mode Base의 블루프린트 화면

방금 만들었던 BP_GameMode로 들어가면 위와 같은 화면이 나옵니다.

여기서 디테일 쪽을 살펴보면 Classes / Player Controller Class가 보일텐데, 여기에 방금 만들었던 BP_PlayerController를

넣어줍니다.

다음으로 Classes / Default Pawn Class에는 BP_Player를 넣어줍니다.

이와 같이 설정합니다.

 

이제 이렇게 설정한 BP_GameMode를 사용하기 위해 설정을 바꿔주어야 합니다.

편집 - 프로젝트 세팅에서 프로젝트/맵&모드의 기본 게임모드를 방금 만든 BP_GameMode로 바꿔줍니다.

기본 게임모드 : BP_GameMode로 변경

이제 플레이해보면 다시 캐릭터가 움직이는 것을 볼 수 있습니다.

이후에 레벨에 올려둔 BP_Player를 지우고 플레이를 해도 캐릭터가 자동으로 생성되는 것을 볼 수 있는데,

이는 월드 아웃라이너를 보면 Player Start가 있어서 Default로 설정해둔 캐릭터를 자동으로 생성해주기 때문입니다.

 

그리고 마지막으로 BP_Player 클래스 디폴트에서 저번에 설정해두었던 Pawn/Auto Possess Player를 Disabled해줍니다.


Player 점프 구현해보기

먼저 키세팅을 해주기 위해서 편집 - 프로젝트 세팅/엔진/입력에서 space키 입력을 추가해줄 것입니다.

점프는 space를 한번 누르기만해도 동작하기 때문에 액션 매핑으로 만들어줍니다.

※ 우측에 Shift Ctrl Alt Cmd는 스페이스 바와 같이 눌러야 작동이 되도록 해주는 키 입니다.


BP_PlayerController에 Jump추가

이제 BP_Controller로 가서 Jump입력 노드를 추가해줍니다.

여기서 Jump를 할 주체는 Controller가 아닌 Pawn이기 때문에 Get Controlled Pawn을 통해서 Possess한 Pawn을

가져옵니다.

 

생각해보면 Jump는 물리적인 움직임이다.

이런 물리적 움직임을 적용해주기 위해선 Character클래스에서만 가능한데, Pawn의 하위 클래스라서 Down Cast 해준다.

(상위 클래스에서 하위 클래스로 Down Cast할 시, 안정성의 위험이 있다. 그래서 Down Cast일 시 Cast Failed핀이 있다.)

 

As Character핀을 통해서 마지막으로 Jump를 연결해주면, 플레이 시 캐릭터가 점프하는 것을 볼 수 있다.


이후에 Jump에 대한 수치들을 수정해주고 싶다면, BP_Character/Character Movement 컴포넌트에서 바꿔줄 수 있다.

- Character Movement : Jumping / Falling에서 Jump Z Velocity는 점프거리를 조절해 줄 수 있다.

 

 

그리고 BP_Player의 클래스 디폴트에서도 점프의 홀딩 시간, 점프 횟수를 바꿔줄 수 있다.

- Character/Jump Max Hold Time : 점프 키를 누를 수 있는 최대 시간

- Character/Jump Max Count : 최대 점프 횟수

 

Jump Max Hold Time을 사용하기 위해선 Stop Jumping의 호출이 필요하다.

따라서 BP_PlayerController에서 Jump 입력 액션에 Stop Jumping 노드를 추가해준다.


애니메이션 추가에 앞서 콘텐츠/Manequin/Animations의 ThirdPerson_Jump 애니메이션은 삭제해준다(첫번째꺼)


Jump Animation 구현해보기

애니메이션 추가를 위해 ABP_Character로 간다.

에셋 브라우저를 통해 Jump_Start/Loop/End 3가지를 Locomotion에 올려준다.(JumpStart/JumpLoop/JumpEnd)

이제 순서대로 Start → Loop → End를 연결해준다.

마지막 End에서는 다시 Idle로 돌아도록 연결해주고, Idle과 Run에서는 곧바로 JumpStart로 오도록 연결해준다.

 

 

여기서 JumpStart로 넘어가는 조건을 생각해보자.

Jump를 하면 순간적으로 중력의 힘보다 세져서 올라가는 것 뿐이지 항상 중력의 힘은 받고 있다.

Idle → JumpStart의 트렌지션 룰로 들어가서 결과(Result)의 Can Enter Trasition을 바꿔준다.

그러한 이유로 TryGetPawnOwner - GetMovementComponent - IsFalling으로 선택해주는 것이다.

 

이는 Run → JumpStart의 트렌지션 룰도 똑같이 바꾸어주어야 하므로 좀 비효율적이 된다.

따라서 우클릭 - 컨듀잇 추가를 통해서 한번에 처리해줄 수 있도록 바꿔주자.


Idle → JumpStart / Run → JumpStart으로 연결했던 트렌지션 룰은 삭제 후 컨듀잇에 연결해준다.

마지막으로 컨듀잇 → JumpStart를 연결해준다.

Idle → 컨듀잇 / Run  컨듀잇 / 컨듀잇 → JumpStart의 트렌지션 룰은 모두 Can Enter Transition을 true로 해준다.

 

컨듀잇 내부의 결과를 IsFalling으로 바꿔준다.

컨듀잇 내부의 결과를 아까 했던 TryGetPawnOwner - GetMovementComponent - IsFalling으로 바꿔준다.

이후에 플레이하고 점프해보면 JumpStart까지 애니메이션이 들어오는 것을 볼 수 있다.