🎮Unreal4/Blueprint

[UE4] Parkour 기능 -2 (Climb, Set Movement Mode, 루트 모션)

공대 컴린이 2023. 2. 16. 20:23
728x90

Parkour 기능을 구현하기 위해 이전 게시글에서 파쿠르가 가능한지 판별하는 검증절차 코드들을 작성하였다.

이제는 파쿠르가 가능한 상황일 때, 다양한 종류의 파쿠르를 실행하도록 실질적인 플레이부분을 구현할 것이다.

🔎 Parkour Data 만들기

파쿠르 데이터를 만들기 위해, 파쿠르의 종류를 먼저 생성해주었다.

 

Parkour Type 열거형(Enum)

파쿠르는 총 7가지의 열거형 변수를 만들어 구현하였다. 파쿠르의 종류로는 Climb, Slide, Short, Normal, Wall이 있고 Fall은 캐릭터가 높은곳에서 아래로 떨어졌을 때 구르기를 위한 Type이다. Max는 파쿠르 상태가 아닌 경우(Idle 일때) 설정할 Type으로 생성하였다.

 

Parkour Data Table

만들어진 Parkour 열거형을 기반으로 실행될 몽타주와, 파쿠르 실행 가능한 최소/최대 거리, 카메라 고정 설정 등의 데이터를 저장하여 Data Table로 생성하였다.

Short와 Normal, Wall 파쿠르 동작은 거리에 따라 다른 파쿠르 몽타주가 실행되도록 거리값을 조절하여 설정해두었다.

 

Parkour Component : 이벤트 그래프 - Begin Play

만들어둔 데이터 테이블을 Parkour 컴포넌트에서 Datas 배열에 저장해놓을 수 있도록 블루프린트를 작성하였다.

 

Parkour Component : Get Data 함수

만들어진 Datas 배열에서 원하는 Parkour 타입의 Enum값을 넣으면 맞는 데이터를 반환해주는 Get Data 함수를 작성하였다. 반환값으로는 입력값으로 받은 Enum값에 해당하는 모든 Data 값들을 전달한다.

🏃‍♀️ 파쿠르 Type별 체크하기 : Climb

파쿠르를 실행하기 위한 데이터 셋팅이 끝났다면, 이제 파쿠르가 가능한 상태일 때 파쿠르 종류 중, 어떤 파쿠르가 실행될 것인지 Check하는 단계가 필요하다.

2-1. Climb Mode 체크하기

Parkour Component : Do Parkour

캐릭터와 파쿠르 장애물의 Hit 판단은 Parkour 컴포넌트의 Tick 이벤트에서 계속 실행되고 있으니 플레이어가 마우스 오른쪽 버튼을 누를 때 파쿠르가 실행되는 Do Parkour 함수만 실행시키면 된다.

 

Do Parkour 함수를 실행하면 파쿠르가 가능한 상태인지 세가지 조건을 검사한 뒤 (이전 게시글에 정리하였음), 파쿠르가 가능한 상태라면 파쿠르의 종류 중 가장 먼저 Climb 파쿠르가 가능한지 검사한다.

 

Parkour Component : Check Climb Mode

Climb 파쿠르는 캐릭터가 높은 벽을 기어 올라가는 모션인데, 이때 캐릭터에 생성해놓은 Arrow들 중, 캐릭터의 머리 앞방향으로 달린 Ceil Arrow에 Hit된 액터가 있는지를 먼저 검사해야 한다.

 

Parkour Component : Check Climb Mode

Hit된 액터가 있다면 Datas 배열에서 Climb 타입의 데이터를 가져온 뒤, 캐릭터가 파쿠르 가능한 최소~최대 거리 안에 속해있는지 검사한 뒤, 파쿠르 가능한 높이인지를 검사하여 모든 조건이 True라면 True를 반환한다.

2-2. Climb Mode 실행하기

Parkour Component : Do Parkour Climb Mode

Climb Parkour가 가능한지 검사한 함수에서 True를 반환받았다면 Do Parkour Climb Mode 함수를 실행하여 실질적인 파쿠르 기능을 실행하였다.

 

먼저, 캐릭터가 파쿠르를 실행할 장애물(Obstacle)을 바라보도록 Actor Rotation을 조절하였고, 거리가 조금 떨어진 위치라면 장애물 바로 앞으로 이동하여 파쿠르를 실행하도록 Actor Location도 조절하였다.

이후 파쿠르 몽타주를 실행하여 캐릭터가 마침내 파쿠르를 실행하도록 구현하였다.


💡 Play Parkour Montage 함수

Parkour Component : Play Parkour Montage

Play Parkour Montage 함수는 현재 파쿠르 타입을 입력값으로 받아와 파쿠르 데이터를 저장해둔 Datas 배열에서 해당하는 데이터값을 뽑아와 몽타주를 실행시키는 함수이다.

데이터 테이블 안에 들어있는 몽타주와, Play Ratio, 몽타주 Section을 전달하여 Anim Montage를 실행시킨다.

💡 Set Movement Mode 함수

몽타주를 실행시키고나서 Character의 Movement Component를 이용하여 Set Movement Mode 함수를 실행시킨다.

  • walking: 표면 위를 걷는데, 마찰력 효과를 가지며, 방해물을 걸어 올라갈 수 있다. 수직 속력은 0
  • falling: 중력 효과를 받아 떨어지는데, 점프하거나 표면의 가장자리에서 발이 떨어진다.
  • flying: 중력 효과를 무시하고 날아간다.
  • swimming: 유체 덩어리를 통해서 수영하고 있는데, 중력 효과와 부심( bouyancy ) 효과의 영향을 받는다.
  • custom: 사용자 정의 커스텀 이동 모드. 매우 많은 서브 모드를 포함할 수 있다.

기본 캐릭터의 Movement Mode 설정은 Walking이고, Climb 파쿠르를 통해 벽을 기어 올라갈 때 Flying 모드로 설정해두었다가, 파쿠르가 끝나면 Walking 모드로 다시 돌려주었다.

Flying모드로 바꿔주지 않으면 Walking모드에서 중력이 적용되어 몽타주가 제자리에서 실행되기만 하고, 위로 올라가지 못한다.

💡 애니메이션 루트 모션

Climb 애니메이션 뿐만 아니라 다른 애니메이션들을 사용할 때 루트모션(Root Motion)이 있는 애니메이션인지 아닌지를 잘 알고 있어야 한다.

 

언리얼 문서 - 루트 모션

루트모션이 없다면 캐릭터가 애니메이션을 실행할 때, 충돌체를 놓고 움직인 뒤 애니메이션이 끝나면 다시 충돌체의 위치로 돌아온다. 또한 충돌체는 두고 움직이기 때문에 애니메이션이 실행될 때 박스나 벽에 충돌되지 않고 그대로 통과한다.

2-3. 파쿠르 끝나면 초기화하기 (End Do Parkour 함수 실행)

Parkour Component : End Do Parkour

파쿠르 몽타주의 끝부분에서 End Do Parkour 노티파이를 배치하여 파쿠르를 끝내는 End 함수를 실행시켰다.

파쿠르가 끝나면 파쿠르 종류와 상관없이 공통적으로 초기화하는 설정문들과, 파쿠르 타입별로 종료시키는 설정문을 각각 실행시켰다. 

Climb 파쿠르는 몽타주 실행 시 Flying 모드로 Movement Mode를 변경해놨으므로, 다시 Walking 모드로 변경해주었다.

 

몽타주 실행 결과, Climb 파쿠르가 성공적으로 실행되는 것을 확인했다.

2-4. 높은곳에서 떨어질 때 Land 파쿠르 실행하기

ParkourComponent : 이벤트 그래프 - Tick 이벤트

Parkcour 컴포넌트의 Tick 이벤트가 실행되면서 충돌되는 파쿠르 장애물이 있는지를 지속해서 검사하는데, 충돌 액터가 없다면 Check Trace Land 함수를 실행시킨다.

 

ParkourComponent : Check Land Mode

Character의 Movement를 이용하여 Is Falling 상태인지 검사하였고, Falling 상태가 맞다면 뛰어내리는 간격만큼 LineTrace를 수행하였다.

캐릭터가 Falling 상태라면 Data의 Extent 값을 추적거리로 사용하여 플레이어에 붙은 Land Arrow 위치에서부터 Extent 추적 거리간을 Line Trace로 검사한다. 해당 Trace에서 Hit되는 액터가 있다면 Hit Results배열의 Land 인덱스에 결과를 저장해두었다.

 

BP_Player : 이벤트 그래프

플레이어가 땅에 떨어졌는지를 검사하는 함수는 Player 블루프린트에서 On Landed 이벤트를 사용하였다.

 

Parkour Component : Check Fall Mode

Do Parkour Land Mode 함수를 시작하면 FallMode인지를 검사하는 Check_FallMode 함수가 실행되는데, 이는 파쿠르가 실행될만큼 높은 위치에서 떨어지는가를 검사하여 결과를 반환한다.

 

Land 파쿠르는 파쿠르 데이터에 설정해둔 일정 최소 높이 이상의 높이에서 추락할 때, 땅에 착지하는 순간 구르기를 하는 모션을 실행한다.

 

Parkour Component : Do Parkour Land Mode

Land 파쿠르가 가능한 조건을 모두 만족했다면 Fall 파쿠르 타입의 몽타주를 실행시켜 구르기 액션을 수행해주었다.

 

ABP_Character : AmimGraph

또한 캐릭터가 공중에서 추락중일때 자연스럽게 떨어지는 모션이 나오도록 애니메이션 블루프린트를 작성해주었다.

 


참조

https://docs.unrealengine.com/4.27/ko/AnimatingObjects/SkeletalMeshAnimation/RootMotion/

 

루트 모션

언리얼 엔진 4 에서 루트 기반 애니메이션을 처리하는 방식을 살펴봅니다.

docs.unrealengine.com

https://lifeisforu.tistory.com/309

 

UE4 Character Movement: MovementMode

주의 : 공부하면서 정리한 것이라 잘못된 내용이 있을 수 있습니다. 이 글은 [ UE4 캐릭터 이동 시스템 가이드 ]의 보충 문서입니다. UCharacterMovementComponent 의 속성은 여러 개의 카테고리로 나뉘는

lifeisforu.tistory.com

728x90