BT와 EQS를 통해서 적의 이동, 공격 알고리즘을 만들었으니 이제 알고리즘이 작동할 때 보이는 모습, 즉 애니메이션을 적용해야 한다.
Handle Sensed Sight
를 호출하고, Handle Sensed Sight
는 Set State as Attacking
를 호출하며 AttackTarget
으로 플레이어를 전달한다.Attacking
상태에서 가장 우선순위가 높은(제일 왼쪽에 있는) 행동이 무기를 장착하는 행동이다.IsWieldingSword
는 말그대로 무기를 착용하고 있는 지를 판단하는 데코레이터. 적 캐릭터의 IsWieldingWeapon
변수 값을 반환한다. 데코레이터 속성이 inverted
이므로 이 값이 false
일 때만 이하의 노드를 실행한다.EquipWeapon()
을 호출하고, 이벤트 디스패처(델리게이트)를 통해 무기 장착 완료시 호출되는 이벤트에 바인딩한다.On Completed
)되면 무기 장착 완료 이벤트를 호출한다.무기 장착 완료 이벤트가 호출되었다 = 캐릭터가 무기를 장착했다
이므로 Finish Execute
노드를 연결해 태스크가 끝났음을 알려준다. (Success에 체크를 잊으면 안된다.)Animation Montage와 Play Montage
- 몽타주는 캐릭터의 애니메이션을 담고 있다. 이 점에선 애니메이션 시퀀스와 크게 차이가 없어보이는데.. 서로 용도 차이가 꽤 있는 편.
구분 애니메이션 시퀀스 (Animation Sequence) 애니메이션 몽타주 (Animation Montage) 목적 단순 애니메이션 재생 및 반복 동작 정의 여러 애니메이션 결합, 블렌딩 및 복잡한 흐름 제어 사용 방식 하나의 애니메이션 클립을 순차적으로 재생 여러 애니메이션 시퀀스를 조합하여 이벤트 기반으로 재생 특징 - 특정 동작(걷기, 뛰기 등)에 사용
- 루프 가능
- 단순 구조로 사용 용이- 조건부 재생 가능
- 블렌드 슬롯 활용 가능
- 노티파이(Notify) 추가 가능주요 장점 - 단순하고 가볍다
- 기본적인 캐릭터 동작 표현에 적합- 복잡한 애니메이션 상태 처리 가능
- 여러 애니메이션 전환 및 이벤트 기반 조작단점 - 단일 동작만 가능
- 복잡한 애니메이션 로직 구현에 부적합- 구성 및 유지보수 어렵고, 너무 복잡해질 수 있음
- 성능 오버헤드 우려상황별 추천 - 루프 애니메이션 (아이들 상태, 기본 이동 등)
- 단일 모션 작업- 복합 동작 (공격 중 무기 휘두르기 등)
- 여러 동작 결합 및 분기가 필요한 경우성능 가벼움, 성능 부담 적음 성능 오버헤드 가능성 있음 (복잡성에 비례) 사용 사례 - 캐릭터 기본 상태 (걷기, 뛰기, 멈춤 등)
- 루프 동작- 이벤트 기반 동작(타격, 특정 행동 등)
- 복합적인 행동 연결 (콤보)
- 요약하자면 단순하고 가벼운 개별 동작은 애니메이션 시퀀스와 블렌드 스페이스가 좋고, 복잡한 행동 조합이나 이벤트 기반 애니메이션은 몽타주가 좋다.
Animation Montage 알아보기
- 몽타주 파일을 열면 아래와 같은 화면이 나오는데 중요한 건 뷰포트 아래 부분.
DefaultGroup.DefaultSlot
- 슬롯을 지정하여 슬롯 별로 다른 애니메이션이 재생되도록 할 수 있다. 대표적으로 상하체의 애니메이션 재생을 분리하여 피격모션을 취해도 다리는 계속 움직이는 것이 있다.
Notifies
- 몽타주 재생 중 특정 프레임에서 알림이 발생하도록 하는 것. 이를 이용해 특정 시점에 이펙트·사운드를 재생하거나, 스켈레탈 메시의 소켓에 무기를 부착할 수 있다. 사진에서는 대략 18프레임에ShowSword
노티가 발생한다.
Curves
- IK Rig 의 수치등을 조작할 수 있다. 위 사진에서는 몽타주가 재생중일 때는 LegIK가 작동하지 않도록 하였다.
Play Montage
EquipWeapon()
이 호출되면 위와 같은 과정이 순서대로 재생된다. 몽타주 재생, 칼 스폰 후 부착,IsWieldingWeapon
참으로 설정..- 여기서 봐야할 부분은 앞 부분이다.
On Completed
에서 이벤트 호출과 별개로 다른 출력핀을 보아야 한다.On Interrupted
를 통해 몽타주 재생중 강제로 다른 행동을 취하게 되었을 때의 상황도 설정할 수 있다.On Notify Begin
->Switch on Name
으로 해당하는 몽타주의 노티파이를 불러올 수 있다. 위에서 설정한ShowSword
노티파이가 실행되면SpawnActor
로 무기(칼)를 스폰한다.- 이렇듯 노티파이를 통해 애니메이션의 특정 시점에 함수를 호출할 수 있다.
Play Montage
를 실행한다. 애니메이션에서 무기가 플레이어와 닿을 것 같은 프레임에 노티파이를 만들어주고, On Notify Begin
에서부터 노드를 만들어주면 된다.Play Sound at Location
으로 공격시 소리를, Sphere Trace for Objects
로 피격 판정 검사를, Apply Damage
로 피격 성공시 대미지를 적용한다.
- 위 GIF를 보면 공격에 맞은 적이 피격 모션을 취하면서 그대로 미끄러져 다가오는 것을 볼 수 있다. 어색하지 않은가?
- 이를 위해 상체와 하체의 애니메이션을 분리할 필요가 있다. 분리 기준은 스켈레탈 메시의 bone이다.
- 몽타주를 이용한 상하체 분리 재생엔 크게 3가지 작업이 필요하다.
spine_02
으로 정했다. 01는 너무 낮고 03는 너무 높다.Animgraph
에서, 최종 포즈인 Output Pose의 전에 아래와 같이 설정해준다
spine_02
로 지정한다. (사진에선 03이지만 넘어가자..)Slot 'DefaultSlot'
을 생성한다.UpperBody
로 슬롯을 바꿔준다.Main State
를 베이스 포즈로 하고, 상체만 로코모션을 재생할 수 있게 된다.DefaultGroup.UpperBody
로 설정해준다.이제 피격 모션을 취하면서도 발놀림을 멈추지 않게 되었다.