본문 바로가기

Memorize: RECALL

Runtime에 생성된 Anim Instance의 BeginPlay

 추후 Ai 캐릭터의 확장 등을 고려하면 Anim Instance가 Mob의 종류마다 다를 필요가 있다. 그래서 Mob 설정을 저장하는 Data Table에 AnimClass Property를 추가하였다.

Mob Data Table의 Properties

 

 Property의 추가 이후, 이를 적용하는 Blueprint를 작성하고 테스트하는 과정에서 문제가 발생했다. Mob의 Anim Instance는 BeginPlay가 호출되지 않는 것이었다. 이 때문에 필요한 Delegate를 Bind하지 못해서 모든 Character들이 Animation없이 A 포즈로 움직였다.

Runtime Anim Instnace 생성 Blueprint

 

 이를 해결하기 위해 평소처럼 Document를 찾아보며 Function의 Call Timing과 대체할 만한 다른 Function을 찾아보던 중 중요한 사실을 발견했다. Anim Instance의 BeginPlay가 Owning Component의 BeginPlay 호출 시점에, 즉 Character의 BeginPlay 시점에 호출된다는 것이다. 그래서 BeginPlay 시점에 생성된 AnimInstance는 BeginPlay가 호출되지 않는 것이었다.

 

 결국 BeginPlay를 대체할 함수가 필요했다. 그래서 NativeInitializeAnimation Function을 사용했다. 이 Function은 Anim Instance의 초기화 시점에 호출되기에 BeginPlay 시점에 생성되는 Anim Instance도 정상적으로 동작하게 되었다.

그러나 예상치 못한 곳에서 문제가 발생하였다. Editor에서 Anim Instance가 있는 Folder에 접근하거나 Anim Instance를 실행, 컴파일할 때도 InitializeAnimation Function이 호출되는 것이었다. 그 때의 Owner는 당연하게도 Null 값이어서 Crash가 발생하는 것이었다. 그래서 Owner의 값이 Null인지 판별하는 코드를 추가했다. 이를 통해 문제를 해결하였다.

최종 NativeInitializeAnimation 코드