Unreal Engine 애니메이션 - Locomotion 스탠딩 / 워킹
언리얼 엔진에서의 애니메이션은 스켈레톤 메쉬를 움직이는 것과 같다. 메쉬가 움직이면 그에 맞는 코스메틱 외형이 움직이며 애니메이션이 동작한다고 할 수 있다.

- 스켈레톤 메쉬 컴포넌트에서 Animation > AnimClass 애니메이션 중 하나를 선택할 수 있다.

- 단일 애니메이션 선택한 이후 캐릭터가 뛰는 모습을 볼 수 있다.
Use Animation Asset 모드로 선택하면 단일로만 동작하는 애니메이션으로 바로 시각적으로 확인할 수 있다. 다른 옵션인 Use Animation Blueprint는 점프, 숙이기, 달리기, 스탠딩 체계적으로 동작한다.
신규 애니메이션 적용
해당 경로로 애니메이션 블루프린트를 생성한다.
Contents
└─Assets
└─Animations
└─APP_Stickman (+)
- 애니메이션 블루프린트 뼈대를 Character_Skeleton메쉬로 선택한다.
- 생성한 블루프린트 앞으로 만들 애니메이션의 공용이며, 이름은 APP_Stickman 이다.

- 이전에 만든 BP_StickMan 에게 애니메이션을 신규로 생성한 APP_Stickman 으로 선택한다.
- 상속에 따라 BP_Player에도 똑같이 적용되어있는지 살펴본다.

- 우측의 A_Running 이미 만들어진 러닝 애니메이션을 Output Pose 으로 이어붙인다.
- 추갈 좌측 Detail 화면의 Settings 아래의 Loop Animation 클릭하여 반복 애니메이션으로 한다.

- 게임 구동 시 다 같이 뛰어가는 모습을 볼 수 있다.
State_Machine - 스탠딩에서 뛰는 애니메이션 만들기
화면에서 별다른 액션을 취하지 않고 뛰기만하는 캐릭을 볼 수 있다. 애니메이션을 다듬어서 움직이지 않을 때는 스탠딩을 이동 키를 누르면 뛰는 모습으로 만들어준다.
State_Machine 를 사용해 상태에 따라 움직이는 애니메이션으로 만들어 준다.

- 신규로 생성한 APP_Stickman 안에서 Locomotion 노드로 추가한다.
- SM 노드를 더블 클릭하여 상태에 따라 동작하는 에디터를 새로 열어주도록 한다.

- Locomotion 내부에 Idle 상태와 Walk / Run 각각 State 노드를 추가한다.
- Idle 내부에는 A_Idle 애니메이션과 연결하고 Loop 를 체크한다.
- Walk / Run 노드에는 A_Walking 노드와 연결해 Loop를 체크한다.
- Entry 부터 시작해 Idle 와 연결한다.
- Idle <-> Walk / Run 두 노드는 특정 상태에 따라 애니메이션을 동작을 결정할 것이므로 트랜지션 선으로 서로 연결한다.
트랜지션 선에는 로직을 붙일 수 있으나 몇 가지 제한되고, 게임로직과 분리되어 있으며 게임 로직과 접근하지 않도록 하였다.
루프를 도는 함수를 만든 다음 동작 도중 타이밍에 맞춰 모든 정보를 가져와 캐싱으로 저장한다. 캐싱한 정보에 기반해 애니메이션 상태를 틀어주는 방식으로 최적화 되어있다.
Graph Initialize- Pawn 변수 가져오기
본인의 Animation 에서 Pawn 정보를 가져와 상태에 따라 애니메이션을 무엇을 틀어줄 지 정해주어야 한다.

- Event Graph 에서 Initialize Animation 초기화 작업으로 가장 먼저 실행하는 것을 설정할 수 있다
- 최종적으로 Pawn의 MovementCharacter 컴포넌트와 StickmanCharacter 컴포넌트와 관련된 기능과 변수들을 가져오도록 변수 오브젝트로 저장하였다.
다음으로 Update Animation 노드로 시작하는 것을 볼 수 있는데, 매 프레임마다 한번 씩 실행하는 노드이다.
Graph Update Animation - 이동 중인지 체크하는 변수 만들기
이동 중인지 아닌지 변수를 만들어 Locomotion의 Idel <-> Walk/Run 각각의 변수 따라서 상태가 변하면 Idle 상태이거나 Walk 애니메이션으로 동작한다.
추가로 가속도 변수를 추가해 Run 애니메이션으로 달리도록 한다.

- 신규 Event Update Animation 노드로 추가로 Sequence 노드와 연결한다.
- Sequence 1번은 GroundSpeed 변수를 불려오도록 노드를 만든다.
- MovementComponent에서 Velocity, Vector Is XY, XY(GroundSpeed) 노드를 추가해 폰의 GroundSpeed 변수를 가져와야 한다.
- Sequence 2번은 이동 중인지 체크하기 위한 bShouldMove 변수를 생성한다.
- MovementComponent 에서 CurrentAccelection 과 GroundSpeed 비교해 bShouldMove 매 프레임마다 값이 무엇인지 체크한다.
- Sequence 1번은 GroundSpeed 변수를 불려오도록 노드를 만든다.
Locomotion 트랜지션 로직 - ShouldMove 변수로 통해 애니메이션 재생
이전에 만든 Locomotion 이어서 트랜잭션 선을 클릭하여 작업한다.
Locomotion - Idle to Walk / Run

- ShouldMove 체크인 경우 걷는 애니메이션을 재생한다.
Locomotion - Walk / Run To Idle

- 걷다가 키를 떼서 GroundSpeed 로 인해 ShouldMove 체크가 해제 된 경우 Idle 상태로 변경한다.