언리얼 - C++ 프로젝트

OpenWorldRpg (7) 공격 애니메이션 구현

earth-star 2025. 4. 27. 08:34

몽타주를 이용하여 공격 애니메이션을 구현해 볼 것이다.

몽타주 블루프린트를 만들고 위와 같이 2개의 다른 공격애니메이션을 넣었다.

블루프린트로 작업한다면 위와 같이 캐릭터의 애님 인스턴스를 구해서 Montage Play 함수에 넣으면 된다.

 

위의 과정을 C++로 구현할 것이다.

먼저 몽타주 플레이를 위해서는 위와 같이 DefalutSlot을 추가해야한다.

캐릭터 헤더 파일에 UAnimMontage 타입의 변수를 만든다.

공격을 입력받을 시 캐릭터메시에서 애님 인스턴스를 가져와 MontagePlay 함수를 동작한다.

 

0과 1중에 무작위로 골라서 Attack1 또는 Attack2를 동작한다.

무기를 장착하지 않았을 시 공격 애니메이션이 나오지 않도록 하기위해서 EActionState를 하나 더 만들었다.

 

Unoccupied 상태여야지만 공격 애니메이션이 동작하게 할 것이다.

좀 더 깔끔하게 하기 위해서 PlayAttackMontage 함수를 새로 만들었다.

 

Unoccupied 상태여야지만 몽타주가 동작하고 동작할때 상태를 Attacking으로 변경한다.

 

따라서 공격 애니메이션 중일때 연속해서 공격을 할 수 없다.

아이템이 공중에 있을때는 위아래로 호버링하고 습득시에는 호버링을 멈추기 위해서 아이템에도 EnumState를 추가하였다.

위에서와 마찬가지로 아이템을 습득하면 상태를 Equipped로 변경한다.

또한 공격애니메이션 동작중에는 움직이거나 마우스로 화면이 돌아가지 않도록 if문을 추가하여 캐릭터가 Attacking 상태일 경우 움직이거나 카메라를 이동할 수 없도록 하였다.

 

공격이 끝나면 다시 상태를 Attacking에서 Unoccupied로 바꾸어야하기 때문에 위와 같이 몽타주에서 AttackEnd 노티파이를 추가하였다.

상태를 Unoccupied로 바꾸는 AttackEnd 함수를 추가하였다.

ABP에서 AttackEnd 노티파이 동작시 AttackEnd 함수를 호출하여 캐릭터 상태를 Unoccupied 로 바꾼다.

아이템이 위아래로 호버링하고 습득하면 호버링을 멈춘다.

 

마우스 왼클릭시 공격을 랜덤으로 하며 공격시에는 움직이거나 카메라를 움직일 수 없다.

 

다 잘 동작함을 볼 수 있다.