Unreal Engine 5 - Project Shooter (9): Animation State Machine과 Animation Montage

mingu Lee·2025년 9월 2일

1. 간단 요약


  • 보조무기 Idle 구현 (위치 값을 저장하여 무기 종류에 따라 위치 값을 변경)
  • Animation State Machine을 사용하여 무기와 조건에 따라 Idle, Aim 전환 기능 구현
  • Reload Anim Montage를 생성하여 재장전 animation 적용 및 notify를 활용하여 재장전 로직 수정.

2. 세부 과정


  1. 보조무기 Idle
  2. Animation State Machine
  3. Reload Animation Montage

2-1. 보조무기 Idle


기존 Rifle을 파지하는 자세에서 SMG로 바꿀 경우 이상하게 됨.

이전에 Retargeting 했던 SMG Idle Animation을 따로 적용.

Rifle IdleSMG Idle

이때 SMG Idle로 Animation을 변경하면 Character의 WeaponInHand Component 값이 달라져서 SMG가 제대로 위치하지 않기 때문에 SMG Idle의 자세에 맞게 Weapon의 Transform 조정.

Weapon마다 WeaponInHand의 Transform 값이 다르므로 Transform 변수를 새로 생성하여 무기에 맞는 Transform을 저장하고, 무기가 Swap될 때마다 해당 무기의 Transform 값으로 WeaponInHand의 Transform을 설정.

2-2. Animation State Machine


Animation State Machine을 통해 현재 Character의 State에 따라 애니메이션이 달라지도록 설정.

Main Weapon은 Idle <-> Aim, Sub Weapon은 Aim 기능이 없으므로 Idle만 설정.

Main WeaponSub Weapon

Main Weapon은 마우스 우클릭 Event가 발생하면 현재 상태를 Aim State로 변경하며, Idle에서 Aim 상태로 전환, Aim에서 다시 마우스 우클릭 Event가 발생하면 Idle로 전환.

2-3. Reload Animation Montage


Reload Animation은 어떤 상태에 따라 재생되는 것이 아닌 특정 동작마다 재생되는 Animation이므로 Animation Montage로 생성하여 Reload 마다 재생되도록 설정.

이때 Weapon이 2종류이기 때문에 각 Weapon마다 Animation Montage를 설정하여 함수의 입력 값으로 주도록 구현함.

이때 Animation Montage를 사용하기 위해서는 ABP에 Slot을 추가해주어야 함.

위의 Play Montage 함수를 Reload가 시작됐을 때 호출.

Character State로 Reloading이라는 State를 추가하여 Reload 중 State를 Reloading으로 전환하여 총알 발사나 Swap이 불가능하도록 설정.

Reload Animation Montage에 ReloadComplete라는 Notify를 추가했고, 해당 Notify가 Trigger 됐을 때 OnReloadComplete라는 Delegate를 broadcast.

Characeter에서 해당 Event를 Bind하여 다시 State를 Idle로 바꾸고, Reload를 마무리함.

3. 구현 중 발생한 문제 및 해결방안


  • Rifle을 Aim 상태로 전환했을 때 LaserPointer가 생기지 않는 버그 발생.
    처음에는 모종의 이유로 Aim 상태가 될 때 LaserPointer가 TurnOff되는 줄 알고 BreakPoint를 걸고 살펴봤지만 문제가 없었음.
    그렇다는 것은 LaserPointer는 정상적으로 작동하는데, 무언가에 가로 막혀서 Laser가 나가지 않는 것이라고 생각.
    Show에서 Collision을 활성화하여 살펴본 결과, Aim 상태에서 LaserPointer 앞에 어떤 Collision이 있는 것을 발견함.
    알고 보니 이전에 Aim 상태에 맞는 Weapon Transform을 조정하기 위해 임시로 만들어둔 Actor가 Visible이 꺼져있는 상태로 남아있었음.
    해당 Actor의 Collision을 꺼주니 Aim 상태에서도 LaserPointer가 정상적으로 작동함.

4. 오늘의 결과물


Aim, Swap, Reload 시 애니메이션이 제대로 재생되는 것을 볼 수 있음.

profile
Github: https://github.com/dlalsrn

0개의 댓글