본문 바로가기

언리얼엔진

15. 애니메이션 몽타주 / 회피(Dodge) 기능 추가하기 / 열거형

Tip!

Ctrl + P로 특정 대상 선택 후, Shift 더블클릭을 하면 애니메이션 창을 여러개 열 수 있음


두 애니메이션을 자연스럽게 이어주는 법

저번에 Draw_Composite에서 Draw_1과 Draw_2 애니메이션을 이어붙여서 자연스럽게 나오도록 해줬다.

Draw_1 애니메이션의 마지막 프레임에서 bone 중에 upperarm_r / lowerarm_r / hand_r의 로컬 위치, 회전 값을 복사하여

Draw_2 애니메이션의 시작 프레임의 upperarm_r / lowerarm_r / hand_r의 로컬 위치, 회전에 붙여넣어주면

두 애니메이션의 시작과 끝이 bone 로컬 위치가 동일한 위치에서 자연스럽게 이어지는 것을 볼 수 있다.

이와 같은 방법으로 이어줄 수 있다.


회피(Dodge) 기능 추가하기

먼저 BP_CharacterInterface에서 신규 함수 (Dodge)를 추가해준다.

그리고 BP_Character에서 방금 인터페이스에 추가했던 Dodge함수의 이벤트 노드를 추가한다.(event Dodge)

인터페이스에서 추가한 함수를 BP_Character에서 노드로 추가함

 

회피 기능으로 쓸 애니메이션 중에서 Roll과 BackStep 애니메이션을 사용할 것이다.

두 가지의 회피 방법을 사용할 것인데, 방향키 + space 키 입력은 Roll 애니메이션이 나오고

space 키 입력만 있다면 BackStep 애니메이션이 나오도록 한다.

Roll과 BackStep

 

캐릭터의 상태를 정의해주기 위해서 먼저 콘텐츠브라우저 콘텐츠에서 새 폴더(Enumerations)를 추가해준다.

그리고 Enumerations 폴더 안에서 우클릭 - 블루프린트 - 열거형을 추가해준다.(E_CharacterState)

Enumerations 폴더 안에 E_CharacterState 열거형 추가


열거형

열거형 기본 화면

 

E_CharacterState안에 들어오면 위와 같은 기본 화면이 보일 것이다.열거기 탭 우측에 보면 추가 버튼을 통해서 열거자들을 추가해줄 수 있다.여기서 Idle, Arming, Acting, Dodging, Damaged, Died 총 6개의 열거자들을 추가해준다.

(상태를 만들어두고 순서를 바꾸거나 삭제하면 버그의 위험이 있기에 하지 않는 것이 좋다.)

 

그리고 열거기 밑에 고급 탭을 열어보면 비트마스크 플래그가 보인다.(여기선 비트마스크 플래그를 사용하진 않을 것이다.)

 

※ 비트마스크 플래그?

비트연산을 통해서 어떤 상태가 켜져있는지 확인한다.

해당 부분을 체크하면 1 2 4 8 16... 순으로 번호 매겨지지만, 체크하지 않으면 0 1 2 3 4 5... 순으로 번호 매겨진다.

하나의 변수에 다수의 boolean을 가지기 위해서 사용한다.

해당 값에 &, |, ~, ^ 연산을 통해서 어떤 상태인지 확인 또는 입력이 가능하다.

이로 인해 다중 상태에 대해 검사해야할 때 유용하게 사용된다.(점프 중에 공격, 달리는 중에 공격 등과 같은 다중 상태)

 

비트마스크 플래그 사용 시, 위와같이 변수에 비트마스크 적용하여 사용 가능


아무튼 열거형에서 추가한 열거자들을 통해서 캐릭터의 상태를 표현하는데에 사용하게 될 것이다.BP_CharacterInterface에서 함수를 더 추가해줄 것이다. 인터페이스에서는 형식에 알맞는 기능들을 가지고 있어야한다.

 

여기서 IsState함수를 하나 만들어준다. 이 함수는 외부에서 현재 대상이 어떤 상태인지 검사하는 역할을 할 것이다.IsState함수에서 입력과 출력을 추가해준다. 입력이 함수의 매개변수, 출력이 함수의 Return값이라 보면 된다.- 입력 : 이름 State / 타입 E_Character_State- 출력 : 이름 bResult / 타입 Boolean

IsState함수를 만들어준 뒤, 입력과 출력을 만들어주었다.

 

이번엔 GetState함수를 만들어서 대상의 현재 상태를 반환할 수 있는 함수를 만들어주었다.따라서 출력만 추가해주면 된다.- 출력 : 이름 State / 타입 : E_Character_State

GetState함수를 만들어주고 출력을 만들었다.

 

이제 BP_Character에서 대상의 state를 담아둘 수 있는 변수(State)를 하나 만든다. (타입 : E_Character_State)

E_CharacterState State변수 생성


Dodge 키 입력 만들기이제 space키 입력을 통해서 Dodge가 나오도록 하기위해 BP_PlayerController로 온다.이곳에서 키입력을 담당하고 있기 때문인데, 기존에 space키 입력은 Jump로 물려있었다.따라서 Jump입력 액션을 지우고 Dodge로 바꿔줄 것이다.

 

Jump 이벤트 노드만 지워두고, 나머지 연결되어있던 노드만 따로 코멘트 생성으로 알아볼 수 있도록 묶어두었다.

Jump 이벤트 노드만 지워두고 옆으로 치워두자.

 

편집 - 프로젝트세팅에서 기존의 Jump로 되어있던 액션 매핑의 이름을 Dodge로 이름만 바꿔준다.

 

이제 BP_PlayerController에서 Dodge이벤트 노드를 추가할 수 있다.다음으로 Get Controlled Pawn에서 Dodge(메세지)노드를 뽑아서 실행핀을 연결시켜준다.이러면 space 키 입력 시, Dodge 호출이 들어온다.

 

이제 BP_Character에서 인터페이스에서 만들었던 Is State 함수를 더블클릭하여 내부로 들어간다.Is State는 먼저 입력받은 State가 현재 대상의 State와 같은지를 판단하는 함수이므로,함수에서 받아온 State와 BP_Character에서 담고있는 현재 대상의 State가 같은지 판단 후에 결과값을 내보내면 된다.

IsState함수 내부

 

Get State함수의 내부에서는 현재 BP_Character의 State변수 값을 그대로 반환해주면 된다.

GetState함수 내부


이제 Dodge이벤트가 호출이 되면, 현재 상태가 Idle인지 먼저 확인한다. 따라서 Is State함수 노드를 연결해준다.IsState에서 타깃의 State가 지정한 Idle인지 Branch 노드를 통해서 검사하고, 그 값이 true라면 Set State 변수 노드를 통해상태를 Dodging으로 바꿔준다.

 

 

여기서 Dodging에는 Roll과 Backstep으로도 나뉘게 되는데 이동입력의 유무에 따라 달라질 것이다.때문에 이동을 담당하는 Character Movement에서 이동값을 가져오기 위해 Get Last Input Vector노드를 뽑아낸다.

Get Last Input Vector노드를 통해 마지막으로 입력된 이동 벡터가 어떤 방향인지 받아올 수 있다.

그 이동 벡터가 0인지 확인해주기 위해 Vector Is Zero 노드로 확인을 해줄 수 있다.

 

해서 Dodging상태에서 현재 이동 입력이 있는지 없는지에 Branch노드의 결과에 따라 애니메이션이 바뀔 것이다.


애님 몽타주 생성하기

이제 애님 몽타주를 통해서 애니메이션을 출력시켜볼 것이다.콘텐츠 브라우저에서 콘텐츠/Meshes/Mannequin/Animations/Common 폴더에 있는 Backstep과 Roll 애니메이션 두 개를

선택하고 우클릭 - 생성 - 애님 몽타주 생성을 해준다.

 

만들어진 애니메이션 몽타주로 들어가면 나오는 화면 구성이다.

애니메이션 몽타주 화면

애니메이션 컴포짓의 상위호환이라고도 볼 수 있다.

애니메이션 중간 중간에 색션을 추가해서 정해진 구간 내의 애니메이션만 반복시켜줄 수가 있다.

이를 통해 원하는 구간을 원하는 만큼 애니메이션을 나오게 하는게 가능하다.


Play Montage

BP_Character에서 방금 만든 애님 몽타주를 사용하여 애니메이션을 내보낼 것이다.Play Montage(몽타주 재생) 노드를 추가해준다.

몽타주 재생 노드

 

몽타주 재생 노드는 잠복성 노드로 흐름과 다르게 백그라운드에서 돌아간다.

- In Skeletal Mesh Component : 현재 대상의 Mesh 연결

- Montage to Play : 플레이 할 몽타주 선택(여기선 True : Backstap, False : Roll)

- Play Rate : 재생 속도 비율

- Starting Position : 애니메이션을 시작할 시간

- Starting Section : 애님 몽타주에서 지정해준 색션 중 시작할 위치

 

- 실행핀 : 잠복성이 아님. 그냥 몽타주 재생 노드를 거치기만 하고 바로 다음으로 넘어감

- On Complete : 애니메이션의 재생이 다 끝났을 때 호출

- On Blend Out : ?

- On Interrupted : 현재 애님 몽타주가 재생되던 중에 모종의 이유로 재생이 중단됬을 때

- On Notify Begin : ?

- On Notify End : ?

 

이후에 애님 몽타주가 다 재생되고 다시 Idle 상태로 돌아오도록 On Complete 노드에서 Set State 변수 노드를 통해 Idle로돌아오게 해준다.

 

애님 몽타주는 우리가 만들어준 애니메이션 블루프린트(ABP_Character)과는 다르게 흘러간다.

따라서 ABP_Character의 AnimGraph에서 DefaultSlot 노드를 중간에 넣어준다.

 

그리고 컴파일 후 실행해보면 BackStep과 Roll 애니메이션이 나오는 것을 볼 수 있다.