Lyra프로젝트를 보다 보면 거의 모든 cpp 클래스 생성자에
ALyraCharacter(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
위처럼 되어 있는것을 볼 수 있습니다.
FObjectInitislzier클래스는 무엇이며 생성자의 인자로 왜 전달하는 것인지 궁금하여 정리하게 되었습니다.
UE 포럼에도 비슷한 글이 있었습니다. 생성자에 'FObjectInitializer'이거 왜쓰냐? 무슨 차이냐? 라는 질문인데
https://forums.unrealengine.com/t/do-i-have-to-use-fobjectinitializer-in-constructor/363383/3
일단 인자로 FObjectInitislzier가 들어가는 것과 안 들어간 생성자의 공통점은 'CDO를 초기화 한다'입니다.
차이점을 알아보기 전에 FObjectInitislzier 클래스가 무엇인지 부터 보도록 하겠습니다.
https://docs.unrealengine.com/5.0/en-US/API/Runtime/CoreUObject/UObject/FObjectInitializer/
c++생성자가 호출되고 나서 UObject를 마무리한다라고 되어있습니다.
무엇을 마무리 한다는 것일까요? FObjectInitislzier클래스는 일단
- 프로퍼티 기본값
- 프로퍼티 접근 권한
- 프로퍼티 리플리케이션 설정
- 프로퍼티 표시 설정
- 프로퍼티 서버 설정 가능 여부
등등 클래스의 프로퍼티를 초기화 하는데 다양한 설정을 제공하는 클래스입니다.
생성자에 전달되는 FObjectInitislzier 파라미터는 const 가 붙어있지만 내장된 뮤트 가능 함수를 통해 프로퍼티와 서브오브젝를 덮어쓰도록 설정할 수 있습니다.
생성되는 UObject는 이러한 변경사항에 영향을 받으며, 이를 사용해서 등록된 프로퍼티 또는 컴포넌트의 값을 변경할 수 있습니다.
즉, CDO를 만들기 직전에 FObjectInitislzier 클래스를 통해서 수정, 변경할 수 있다는 소리입니다.
AUDKEmitterPool::AUDKEmitterPool(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer.DoNotCreateDefaultSubobject(TEXT("SomeComponent")).DoNotCreateDefaultSubobject(TEXT("SomeOtherComponent")))
{
// 여기서 CDO 프로퍼티를 초기화시킵니다.
}
위의 경우 Super클래스는 생성자에서 SomeComponent와 SomeOtherComponent를 생성하고싶어도 생성하지 못합니다.
이런식으로 네이티브 c++생성자에 FObjectInitislzier 인자로 넣어 CDO를 수정할 수 있다~
ALyraCharacter(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
그래서 위 코드는 FObjectInitializer::Get을 통해 FObjectInitializer 클래스의 기본 인스턴스를 반환하여 FObjectInitializer 클래스에 전달 후 초기화 수행한다
https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/GameplayArchitecture/Classes/
'UE5' 카테고리의 다른 글
[UE] UObject::CreateUObject Delegate 바인딩 언제, 어디서, 왜 쓰는지 (0) | 2024.01.05 |
---|---|
[UE] UE_INLINE_GENERATED_CPP_BY_NAME + LNK2005 (1) | 2024.01.03 |
[UE] ArcheType (0) | 2023.12.31 |
[UE] GetOuter() (0) | 2023.12.24 |
[UE] StaticClass (0) | 2023.11.29 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!