[UE5] 적 AI 만들기 (3)

김재석·2025년 3월 13일
0
post-thumbnail

애니메이션 적용하기

BT와 EQS를 통해서 적의 이동, 공격 알고리즘을 만들었으니 이제 알고리즘이 작동할 때 보이는 모습, 즉 애니메이션을 적용해야 한다.

무기 장착·해제

  • AI컨트롤러는 AI Perception Component에 의해 시야에 플레이어가 감지되면 Handle Sensed Sight를 호출하고, Handle Sensed SightSet 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는 너무 높다.



1. Layered blend per bone

  • 캐릭터의 애니메이션 블루프린트의 Animgraph에서, 최종 포즈인 Output Pose의 전에 아래와 같이 설정해준다


  • 이 노드는 지정한 bone을 기준으로 하여 Base Pose와 Blend Pose를 섞어주는 노드라고 보면 된다.
  • Layer Setup - branch filters - Bone Name을 아까 결정한 spine_02로 지정한다. (사진에선 03이지만 넘어가자..)


2. 슬롯 노드 만들기

  • 애님그래프에서 우클릭 후 Slot 'DefaultSlot'을 생성한다.
  • 사진과 같이 연결 후 디테일 패널을 보면 슬롯을 바꿔줄 수 있다. 우리가 원하는 UpperBody로 슬롯을 바꿔준다.
  • 이렇게 하면 Main State를 베이스 포즈로 하고, 상체만 로코모션을 재생할 수 있게 된다.


3. 몽타주 슬롯 적용하기

  • 아까 애니메이션 몽타주 파일을 열었을 때 봤던 슬롯 부분을 지금 활용하게 된다.

  • DefaultGroup 에 포인터를 가져가면 Slot 이 나타난다. 그 후 위와 같이 슬롯을 DefaultGroup.UpperBody로 설정해준다.
  • 상하체 분리 적용을 원하는 다른 몽타주들도 동일하게 설정을 해줘야 한다.




이제 피격 모션을 취하면서도 발놀림을 멈추지 않게 되었다.

0개의 댓글

관련 채용 정보