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)

회피 기능으로 쓸 애니메이션 중에서 Roll과 BackStep 애니메이션을 사용할 것이다.
두 가지의 회피 방법을 사용할 것인데, 방향키 + space 키 입력은 Roll 애니메이션이 나오고
space 키 입력만 있다면 BackStep 애니메이션이 나오도록 한다.

캐릭터의 상태를 정의해주기 위해서 먼저 콘텐츠브라우저 콘텐츠에서 새 폴더(Enumerations)를 추가해준다.
그리고 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
이번엔 GetState함수를 만들어서 대상의 현재 상태를 반환할 수 있는 함수를 만들어주었다.따라서 출력만 추가해주면 된다.- 출력 : 이름 State / 타입 : E_Character_State
이제 BP_Character에서 대상의 state를 담아둘 수 있는 변수(State)를 하나 만든다. (타입 : E_Character_State)
Dodge 키 입력 만들기이제 space키 입력을 통해서 Dodge가 나오도록 하기위해 BP_PlayerController로 온다.이곳에서 키입력을 담당하고 있기 때문인데, 기존에 space키 입력은 Jump로 물려있었다.따라서 Jump입력 액션을 지우고 Dodge로 바꿔줄 것이다.
Jump 이벤트 노드만 지워두고, 나머지 연결되어있던 노드만 따로 코멘트 생성으로 알아볼 수 있도록 묶어두었다.
편집 - 프로젝트세팅에서 기존의 Jump로 되어있던 액션 매핑의 이름을 Dodge로 이름만 바꿔준다.
이제 BP_PlayerController에서 Dodge이벤트 노드를 추가할 수 있다.다음으로 Get Controlled Pawn에서 Dodge(메세지)노드를 뽑아서 실행핀을 연결시켜준다.이러면 space 키 입력 시, Dodge 호출이 들어온다.
이제 BP_Character에서 인터페이스에서 만들었던 Is State 함수를 더블클릭하여 내부로 들어간다.Is State는 먼저 입력받은 State가 현재 대상의 State와 같은지를 판단하는 함수이므로,함수에서 받아온 State와 BP_Character에서 담고있는 현재 대상의 State가 같은지 판단 후에 결과값을 내보내면 된다.
Get State함수의 내부에서는 현재 BP_Character의 State변수 값을 그대로 반환해주면 된다.


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 애니메이션이 나오는 것을 볼 수 있다.
'언리얼엔진' 카테고리의 다른 글
| 17. Getter함수 생성 / Montage 애니메이션 섹션 (0) | 2023.05.23 |
|---|---|
| 16. 매크로 라이브러리 / 구조체 / DataAsset (0) | 2023.05.22 |
| 14. Draw 애니메이션 / AttachActorToComponent / 인터페이스 (2) | 2023.05.19 |
| 13. 프리뷰 애셋 / 소켓 / 캐릭터에 무기 생성 / For Each Loop (0) | 2023.05.17 |
| 12. 속력에 따른 Walk to Run / Weapon 만들기 (2) | 2023.05.16 |