200324 UE4 ( 애니메이션 에디터 커스텀 삽질 등 )

2020. 3. 25. 02:27프로그래밍/TIL

1. 애니메이션 에디터의 프리뷰 스켈레탈메시에 재생 중인 AnimationAsset 의 프로퍼티값에 따라 특정 Component 를 붙히려고 시도

 

-발생 이슈

처음 열었던 애니메이션 에셋 에서는 프로퍼티값 변경도 잘 적용되고 문제없는데, 애니메이션 에셋만 바꾸면 붙혔던 컴퍼넌트가 안보임.

-이슈 원인

애니메이션 에셋이 바뀔 때, PreviewMesh 쪽에 Preview 를 목적으로 Attach 시켜두었던 컴퍼넌트를 제외하고는 모두 Detatch 시키고 Destory 까지 시킴.

 

생각해보면 애님노티파이에 따라 파티클이나 기타 컴퍼넌트들이 PreviewMesh 에 Attach 될 것이고, 애니메이션이 바뀌면 이전 애니메이션에 Attach 시켜뒀던 것들을 모두 클리어 시키는게 당연한데.. 오만가지 시나리오로 추적하다가 뒤늦게 눈치챔.

 

-관련 코드

애니메이션 에디터에서 Preview 를 담당하는 객체는 FAnimationEditorPreviewScene 이다.

 

여튼 문제됬던 부분은 FAnimationEditorPreviewScene::SetSetPreviewAnimationAsset() 에서 RemoveAttachedComponent() 를 통해 앞서 언급했던 Preview 목적으로 어태치 시킨 것 외에는 모두 Destroy 시킨다.

 

-참고 코드

이 삽질로 애니메이션 에디터 관련 코드들을 살펴 볼 수 있었는데 대표적으로 참고했던 코드들은 다음과 같다.

FPersonaToolkit : UE4 의 페르소나 피처들 중, Skeleton 과 관련 있는 에셋 에디터에서 사용하기 위한 유틸기능들.
FAnimationEditorPreviewScene : 애니메이션 에디터 프리뷰 객체. Tickable 이다.  PersonaToolKit 에서 생성된다. 스켈레톤 마다 일대일 대응으로 생성된다. ( 스켈레톤이 다르면 새로운 PreviewScene 를 생성함 -> 애니메이션 에디터에 새로운 탭이 생긴다는 의미 )
SAnimationEditorViewport : 애니메이션 에디터에서 뷰포트 슬레이트.

 

2. 현재 재생중인 애니메이션 에셋 목록

UE4 에는 다양한 애니메이션 에셋 타입들이 존재하고, SyncGroup 등 애니메이션 재생기법들이 많다.

그 다양성 때문에 애니메이션 노티파이 처리부터 각 타입의 전용 로직으로 애니메이션 Tick 을 처리한다.

그래서 딱 이렇다 할만한 현재 재생 중인 애님 에셋 목록들을 담는 컨테이너가 눈에 띄질 않았다.

 

있을 법한데 해서 계속 찾다보니, AnimProxy 에서 애니메이션 Tick 처리하는 부분과 UE4 의 애니메이션 디버깅 정보 표시 쪽에서 어떻게 데이터를 가공하는지 보고 알 수 있었다.

참고 한 부분
FAnimInstanceProxy::TickAssetPlayerInstances()
UAnimInstance::DisplayDebug()

 

현재 재생 중인 애니메이션에셋들은 AnimProxy 의 두 Array 에 담겨지고,

FAnimInstanceProxy::SyncGroupArrays ( 코드로만 슥 봤을땐 몽타주도 SyncGroup 으로 처리되면 여기 담긴다. )
FAnimInstanceProxy::UngroupedActivePlayerArrays

몽타주 같은 경우엔, AnimInstance 의 Array 에 담긴다.

UAnimInstance::MontageInstances

몽타주 같은 경우엔 BlendOut 되고 있는 것들도 같은 컨테이너에 있기 때문에 활성화/플레이 여부 체크가 필요하다.

( 그래서 UE4 에선 현재 몽타주를 Array 에 가장 마지막에 추가된 녀석을 리턴 시켜준다. 활성화 된 것중 한개만 리턴되~ 라는 주석과 함께 -0- )

'프로그래밍 > TIL' 카테고리의 다른 글

200530 Detail Layout 커스텀  (0) 2020.05.30
200325 UE4 애니메이션 에셋 브라우저 Column 추가  (0) 2020.03.26