[UE5.3] ClassFinder와 ObjectFinder 차이

컵피자·2024년 5월 21일

UNSEEN-2ND & UNREAL

목록 보기
6/9

🍕조민주: 저 ConstructorHelpers::ClassFinder와 ObjectFinder를 사용하는 차이가 궁금한데요
제가 아는 바로는 생성자에서 컴포넌트 속성에 등록할 때,, 애니메이션 BP나 위젯 BP 등 BP의 클래스 정보를 불러오기 위해 ClassFinder가 사용되고, BP가 아닌 리소스를 불러오려면 ObjectFinder가 사용되는 것 같았습니다.
구글링 해보니까 ClassFinder는 애셋의 Type 정보를 가져올 때, ObjectFinder는 애셋의 내용물을 가져올 때 사용한다고 하는데요. ( https://kyoun.tistory.com/131 )
정확히 어떤 차이가 있는 건지 아직 완벽하게 이해하지 못한 것 같아요
그래서 왜 BP 정보를 가져올 때만 ClassFinder 인지 ??? 설명해주실 수 있을까욥?

제가 이해한 것에서 틀린 부분이 있다면, 알려주시면 감사하겠습니닷

🐻정안님: 많이 부족하지만, 저도 1차원적으로는 이렇게 이해했습니다. 말 그대로 클래스정보로 제가 생성한 블루프린트 클래스, 액터 컴포넌트 등을 생성자 단계에서 안전하게 로딩하는 방식으로 이해했고, 나머지 정적 리소스 즉, 에셋들은 ObjectFinder를 통해 로딩하는 방식으로 이해했습니다.

많이 부족하지만? BP도 마찬가지로 클래스이기 때문에, BP도 ClassFinder를 통해 로딩하는 것으로 이해했습니다.

좋은 논의 내용을 주셔서 저도 조금 더 생각해보게 되네요!

🍕조민주: 아하!!! 오오 이해됐습니다 친절한 설명 감사해요! ㅎㅎ

BP도 결국 클래스이기 때문이군요

🐻정안님: 아마 위 블로그에서 언급하는 CDO의 개념이 결국 언리얼 UObject를 상속 받은 클래스라 그런 것 같습니다. 실제로 블루프린트 오른쪽 위에 보면 현재 상속 받은 클래스도 보이고, 컴파일을 진행해야만 사용할 수 있는 부분도 같은 이유인 것 같아요.

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/compiler-overview-for-blueprints-visual-scripting-in-unreal-engine?application_version=5.3

🍕조민주: 오옷 감사합니다 CDO 개념을 확실히 알아야 하는데, 저도 간과했던 부분이네욥🥹
참고 주신 문서 보면서 복습하겠습니닷 ㅎㅎ 👍

다른 의견도 편하게 주시면 감사하겠습니다!!

멘토님들의 의견

타입을 가져온다기보다는,, CDO(생성자)로 오브젝트를 미리 만들어놓거든요 모든 클래스마다. 객체를 가져와서 쓸 수 있어가지고. 생성자에서 미리 초기화된 데이터를 사용할 수 있어요. 그걸 ClassFinder로 로드해서 이용하는 것입니다. BP 클래스(도 결국 클래스다) 맞는 설명이에요.

ConstructorHelpers 라면 맞는 설명입니다.

ObjectFinder는 실질적으로 애셋을 쓰려면 메모리에 로드를 해야하거든요. 그 로드한 애셋에 대한 내용물을 가져다 쓰겠다는 의미입니다!

스켈레탈 메시를 로드한다던가 텍스쳐도 다 로드합니다!

※ ObjectFinder 도 무거우면 로드도 느려질거에요.

ClassFinder는 타입만 가져오겠다 ..

예를 들어 스켈레탈 메시 여러개 있을 거잖아요 일종의 설계도인 거고, 그걸 토대로 해골 상자 여러개 만들었는데 해골 설계도에 대한 걸 가져오겠다 하면 ClassFinder가 맞고 오브젝트 내용만 가져오겠다면 ObjectFinder를 쓰는 게 맞습니다.

  • UClass는 ClassFinder
  • UObject 상속받는 클래스는 ObjectFinder로 로드해서 넣으면 된다.

UObject에서 이 타입(클래스)을 가져와서 새로 오브젝트를 생성하려 할 때 사용되는 키워드 GetObjectType ? 이 있다.

GetObjectType은 C++아니고 언리얼에서 지원하는 것입니다.

C++ TypeOf 있긴하네요 ? 근데 언리얼 GetObjectType랑 개념은 많이 다르다! 비슷하긴 한데 같진 않습니다. 동작 방식이 완전히 틀려요. 언어 차원에서 지원되는 것과 엔진 차원에서 지원되는 것의 차이.

TObjectPtr로 변수 많이 할당해서 애셋 연결하고 하시는데! 쓰기에는 편한데! 문제는 이 블루프린트에 연결된 TObjectPtr 에셋 모듈도 같이 로딩하거든요. 연결된 애셋이 500MB 이상이다 그러면 로드할 때 한참 걸려요… 로드할 때 게임이 멈출 거에요…

해결방법: TSubobjectPtr로 블루프린트 먼저 연결 시켜놓고(빠르게 로드), 애셋은 나중에 로드하는 방식으로 하면 게임 끊김 없이 처리할 수 있습니다.

이게 대부분의 로딩 지연 오류 원인입니다.

생성자 이외에서는 LoadObject를 쓰시면 됩니다. 똑같은 건 아닙니다만 … ! 비슷한 기능 !

TSoftObjectPtr: 수동으로, 나중에 로드할 때 사용하는 거거든요. (CALL한 시점에서)

언리얼 엔진의 비동기 에셋 로딩

0개의 댓글