본문 바로가기
[ Unreal5 ]/- 언리얼엔진5 실습

언리얼엔진5 c++ ConstructorHelpers::FClassFinder와 LoadClass<>, LoadObject<> 차이

by MRG 2024. 9. 14.
728x90
반응형

 

 

▣ ConstructorHelpers::FClassFinder
역할: 클래스를 찾는 데 사용되며, 주로 객체(액터, 컴포넌트 등)의 생성자(Constructor)에서 사용됩니다.

사용 시점: 객체가 생성될 때, 자산이나 클래스를 미리 로드하여 사용할 때 주로 사용됩니다.

특징:
주로 생성자 안에서 사용되며, 클래스나 자산을 즉시 로드합니다.
하드 리퍼런스를 사용하기 때문에 로드 경로에 있는 자산이나 클래스가 반드시 존재해야 합니다.
잘못된 경로나 존재하지 않는 클래스가 있을 경우 런타임 에러가 발생할 수 있습니다.
로드가 즉시 이루어지기 때문에, 게임 시작 시점 또는 에디터 로드 시점에 성능 저하를 초래할 수 있습니다.
주 사용 사례:

클래스가 반드시 있어야 하는 경우: 즉시 해당 클래스를 찾아서 로드해야 할 때 유용합니다. 예를 들어, 특정 위젯, 캐릭터 블루프린트, 컴포넌트 등을 미리 로드해서 게임이 시작되자마자 바로 사용할 수 있어야 하는 경우.


▣  LoadClass<>
역할: 클래스를 지연 로드(Lazy Loading) 방식으로 로드합니다.

사용 시점: 클래스가 필요한 시점에 동적으로 로드할 때 사용됩니다.

특징:
클래스가 필요한 시점에서 동적으로 로드됩니다. 즉, 런타임 중에 클래스가 필요할 때 로드할 수 있습니다.
LoadClass는 메모리 관리 측면에서 유리합니다. 필요한 시점에 로드하기 때문에 불필요한 자산을 미리 로드하지 않아 메모리 사용을 절약할 수 있습니다.
하드 리퍼런스 대신 지연 로드 방식이기 때문에, 게임이 시작된 후 언제든지 사용할 수 있습니다.
잘못된 경로나 자산이 없을 경우, NULL 포인터를 반환하므로 더 안전하게 사용할 수 있습니다.


주 사용 사례:
런타임에 특정 클래스가 필요할 때: 게임 진행 중 특정 상황에서만 클래스를 로드하고 싶을 때 유용합니다. 예를 들어, 특정 레벨이 로드된 후에만 필요한 위젯이나 캐릭터 클래스를 로드할 때.

 

 

 

▣ 해당 코드에서 FClassFinder<>를 사용했습니다.

코드 자체는 정상적인 사용 방식이지만, 이 코드가 프로젝트를 다시 열 때 75%에서 멈추는 문제를 발생시키는 이유는 주로 아래와 같은 원인에서 발생할 수 있습니다.

잘못된 경로 문제:
지정된 경로가 잘못되었거나 위젯 파일이 삭제되거나 이동된 경우, 언리얼 에디터가 파일을 찾을 수 없어서 로딩 과정에서 멈출 수 있습니다.


▣  위젯 클래스의 이름 문제:
경로에 .WB_HUD_C와 같은 특정한 이름을 명시할 때, 만약 클래스 이름이 정확하지 않거나 위젯 파일이 정상적으로 생성되지 않았다면 문제가 발생할 수 있습니다. WB_HUD_C는 컴파일된 블루프린트 클래스 이름이므로, 이 클래스가 정상적으로 로드되지 않는 상황에서 로딩이 멈출 수 있습니다.
로드 시점 문제:

▣ ConstructorHelpers::FClassFinder는 주로 생성자에서 사용되며, 객체가 로드될 때 리소스를 미리 불러오려고 합니다. 하지만 이 코드가 잘못된 시점에서 호출되면 프로젝트가 로드되는 동안 문제를 일으킬 수 있습니다. 특히, 로드 중에 참조하는 파일이 유효하지 않거나 지연 로딩이 필요한 경우, 언리얼 에디터가 해당 클래스를 로드하는데 문제가 생길 수 있습니다.
해결 방법
경로 확인: 경로가 정확한지 확인하는 것이 가장 먼저 해야 할 일입니다. WB_HUD 위젯이 실제로 해당 경로에 있는지, 그리고 파일이 유효한지 확인하세요. 언리얼 에디터의 콘텐츠 브라우저에서 파일을 찾아보고, 정확한 경로를 다시 확인하세요.

▣ 지연 로딩 사용: ConstructorHelpers::FClassFinder 대신 위젯을 지연 로드하는 방법으로 변경할 수 있습니다. 이렇게 하면 언리얼 에디터가 위젯을 로드하는 시점에서 충돌을 방지할 수 있습니다.



▣ 이럴경우 생성자가 아닌 위에 코드처럼 LoadClass<>또는 LoadObject<>를 사용하면 해결됩니다. 





▣ 관련 API

 

https://docs.unrealengine.com/4.27/en-US/API/Runtime/CoreUObject/UObject/ConstructorHelpers/FClassFinder/

 

 

https://docs.unrealengine.com/4.27/en-US/API/Runtime/CoreUObject/UObject/Static/LoadClass/

 

728x90
반응형

댓글