들어가며
개발을 해 보면 Constructor에서 Play단계에서 쓰는 함수를 호출하지 말 것이라는 사항. 그리고 Constructor가 Engine 초기화 과정에서 CDO 생성 때 호출되는 건 알았는데, 왜 그렇게 해야 문제가 되는 건지 확실하게 짚고 넘어가고자 테스트를 진행해 봤다.
테스트 방법
1. GetDefaultObject() 호출을 통한 확인
AMyActor::AMyActor()
{
AMyActor* TestPTR = Cast<AMyActor>(AMyActor::StaticClass()->GetDefaultObject());
if(!TestPTR)
{
UE_LOG(LogTemp, Warning, TEXT("CDO is nullptr. CDO maybe created"))
}
else if(TestPTR == this)
{
UE_LOG(LogTemp, Warning, TEXT("This is CDO. Constructor Called"));
}
else
{
UE_LOG(LogTemp, Warning, TEXT("This is not CDO, but Constructor Called"));
}
}
2. 해당 액터의 Constructor가 호출될만한 환경 설정 후 중단점을 걸어 확인
[테스트 케이스]
케이스 1 : Editor를 실행, 해당 액터가 스폰된 레벨을 기본 에디터 로딩 레벨로 설정
케이스 2 : Editor를 실행, 해당 액터가 스폰되지 않은 레벨을 기본 에디터 로딩 레벨로 설정
케이스 3 : Editor가 실행된 상태에서 해당 액터의 Constructor에 수정을 한 후 Live Compile 수행 시 호출되는지 확인
케이스 4 : Editor가 실행된 상태에서 해당 액터가 스폰된 레벨에서 플레이(PIE)를 할 시 확인
케이스 5 : Editor가 실행된 상태에서 해당 액터가 스폰되지 않은 레벨에서 액터가 스폰된 레벨로 전환 시 확인
[수행 결과]
1. Editor 실행 시, 레벨 오픈 시 1번씩 Contructor 호출 확인, Editor 실행 시에는 CDO == this를 만족해서 호출하는 것을 확인
2. Editor 실행 시 CDO == this에서 중단점 걸리는 것을 확인
3. Live Compile 시 Constructor가 호출되진 않음.
4. PIE 클릭 시 Constructor가 호출되었음. else 케이스에 걸림
5. Open Level? 일 때 한 번 호출되고 레벨이 로딩되면서 한 번 더 호출됨. 둘 다 else 케이스
[깨달은 점]
1. CDO는 모듈 로드 시 한 번 생성된다.
2. Constructor가 여러 번 호출된다...?
3. 따라서, Constructor 호출 시 엔진이 초기화 되기 전 호출되는 코드를 호출한다는 행동을 하는 경우 if()문으로 nullptr 체크를 하는 등의 행위가 반드시 필요하다.
'Unreal Engine > 이것 저것' 카테고리의 다른 글
| [Network] 채팅 프로그램 만들기 (0) | 2025.03.17 |
|---|---|
| 게임 언패킹과 리타게팅, 그리고 머티리얼에 대하여 ( 1 ) (0) | 2025.02.07 |
| 에디터에서 FVector 수정을 위한 UPROPERTY 사용 (0) | 2025.02.03 |
| 유튜브 레퍼런스 (0) | 2025.02.01 |
| Procedural Mesh Component를 이용한 Convex Collision 생성 (0) | 2025.01.31 |