-
[Unreal] NewObject로 생성한 오브젝트에서 GetWorld() 가 nullptr 이라면쾌락없는 책임 (공부)/Unreal 2023. 4. 19. 21:50반응형
개요
프로젝트를 진행하던 중 NewObject로 동적으로 생성한 인스턴스에서 GetWorld를 부를 수 없는 문제가 있었습니다. 왜 GetWorld가 nullptr을 반환할까 궁금하던 와중 결론을 얻게 되었습니다. Outer 인자를 지정해주지 않아서 이런 일이 있었던 것입니다.
결론
UObjet::GetWorld()는 조금 특수하게 되어 있습니다.
class UWorld* UObject::GetWorld() const { if (UObject* Outer = GetOuter()) { return Outer->GetWorld(); } #if DO_CHECK if (IsInGameThread()) { bGetWorldOverridden = false; } #endif return nullptr; }
아무래도 액터처럼 씬 내 직접적으로 있는 단위가 아니다 보니 GetWorld를 위해서는 Outer에서 이를 가지고 있어야 하는 구조였습니다.
template<class T> T * NewObject ( UObject * Outer, const UClass * Class, FName Name, EObjectFlags Flags, UObject * Template, bool bCopyTransientsFromClassDefaults, FObjectInstancingGraph * InInstanceGraph, UPackage * ExternalPackage )
실제 코드는 너무 더럽게 되어 있어서 언리얼 공식 독스에서 가져왔습니다.
NewObject
Convenience template for constructing a gameplay object
docs.unrealengine.com
보시면 생성 시 Outer와 Class 등을 지정할 수 있는데 여기서 Outer를 지정해줘야 GetWorld를 무사히 부를 수 있게 됩니다.
auto ItemPool = NewObject<UItemSpawnPool>(this, PoolClass);
이런 식으로 말이죠.
반응형'쾌락없는 책임 (공부) > Unreal' 카테고리의 다른 글
[Unreal] 언리얼 유효성 검사 - IsValid, == nullptr, ensure (1) 2023.05.15 [Unreal] 언리얼 Anim Notify State C++로 작성해보기 (0) 2023.04.27 [Unreal] UI Click, Hover 이벤트 안불리는 문제 (0) 2023.03.27 [Unreal] 언리얼 ListView 간단하게 알아보기 (0) 2023.03.23 [Unreal] Unreal StaticMeshComponent0 has to be ‘Movable’ if you’d like to move 경고 (0) 2023.03.21