Make Unreal REAL.
article thumbnail
Anim Instance의 델리게이트가 발동되지 않는 문제 (해결 과정) 보기

 

AI 몬스터는 공격 애니메이션을 재생하고, 애니메이션에 있는 Attack 애님 노티파이를 통해 공격 로직을 수행하도록 구현했다.

 

몽타주에서 Attack 애님 노티파이가 발생
몬스터 클래스의 OnAttackTarget() 함수가 애님 노티파이 시 발동하는 OnAttack 델리게이트에 등록되어 있음
Attack 애님 노티파이로 인해 OnAttack 델리게이트가 발동
OnAttack 델리게이트에 등록되어 있는 OnAttackTarget() 함수가 실행

 

하지만, 내가 AI를 1번 때린 이후부터는 내게 데미지를 입히지 않는 당황스러운 문제가 발생했다.

 

내가 AI를 때리자 다가와 나를 공격
AI가 1대 맞으니 데미지를 주지 않는 로그 (좌) / 맞은 적이 없어 데미지를 주는 로그 (우)

 

자세한 해결 과정은 이 링크를 참고하면 된다.

Anim Instance의 델리게이트가 발동되지 않는 문제 (해결 과정) 보기

 

테스트와 삽질을 거쳐 찾아낸 원인은 다음과 같다.

Anim Instance의 델리게이트가 발동하지 않았던 원인
1. Behavior Tree에서 Play Animation Task로 애니메이션을 재생한다.
2. Animation Mode가 Single로 바뀌면서 기존 Anim Instance가 정리된다.
3. 재생이 끝난 후 다시 Blueprint 모드로 바뀌지만, Anim Instance는 새로 생성된 상태다.
4. 그래서 이미 정리되버린 Anim Instance의 델리게이트에 등록되어 있던 함수들은 실행될 수 없다.

 

 

그래서 Behavior Tree에 있는 Play Animation Task로 피격 애니메이션을 재생한 후에는, Animation Mode가 바뀌는 과정에서 Anim Instance가 정리된 후 재생성되어 OnAttack 델리게이트에 아무 함수도 등록되어 있지 않았던 것이다.

 

언리얼 관련 현업자 분들이 계시는 단톡방에서 자문자답으로 해결하고 나니 조언도 듣고 칭찬도 받았다.. 🤗🤗🤗

 

 

애니메이션 BP 모드에서 SkeletalMeshComponent::Play Animation() 함수를 실행하면 Anim Instance가 초기화된다는 사실은 꿈에도 몰랐고, 아마 다른 사람들도 그럴 수 있을 것이라고 생각했다.

 

그래서 혹시 몰라 언리얼 엔진 Github 레포지토리에 Draft PR을 넣긴 했지만 역시나 반영되지는 않다.. 😭😭😭

  • 엔진 코드를 분석해 ClearAnimScriptInstance(), InitializeAnimScriptInstance() 함수가 Anim Instance를 초기화한다는 걸 알아냈다.
  • bForceClearAnimScriptInstance라는 파라미터를 추가해 초기화 여부를 인자로 받아 작동하도록 수정했다.

 

 

문제가 명확하지 않다는 답변을 받아서 이 문제가 발생하는 간단한 코드를 첨부하여 설명했고, 다음과 같은 피드백을 받았다.

  • 델리게이트 등록을 Anim Instance의 BeginPlay()나 InitializeAnimation() 함수에서 할 수 있지만, 종속성이 반전되므로 좋은 방법은 아니다.
  • Play Animation Task 대신, 몽타주를 재생하는 별도 Task를 만들어 사용해도 된다.

 

 

나보다는 훨신 실력자가 해주신 조언이니 바로 수긍하기로 했다.

 

그래서 몬스터 AI의 피격과 죽음 애니메이션은 Github PR과 단톡방 조언을 토대로 BP와 Single 모드를 혼합해 쓰지 않고, BP에서 모두 처리하도록 수정했다.

 

 

Play Animation Task 대신 AnimationEnd 애님 노티파이가 발생할 때까지 대기하는 Wait Animation End Task를 만들어 대체했다.

 

 

이제 문제가 해결됐다..

 

AI가 맞은 후에도 내게 데미지를 입힌다.

 

AI가 맞은 후에도 캐릭터에게 데미지를 입히는 로그

 

이번 작업에서 느낀 점 👨‍💻👨‍💻👨‍💻
  • 남에게 무조건 물어보는 것보다 스스로 고민해보면서 원인을 찾다보면 더 깊이 있게 이해할 수 있는 것들이 많다.
  • 하지만 남의 도움도 필요할 땐 받아야 하고, 더 좋은 의견과 피드백을 통해 성장할 수 있다.
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그