GetOuter()란?
NewObject를 사용할 일이 생겨 NewObject함수를 보다가 첫번째 인자로 GetOuter()가 무엇인지 궁금하여 찾아 보게 되었습니다.
공식문서를 보면 "Returns the UObject this object resides in"이라고 되어 있습니다.
뭔가 느낌적인 느낌으로 자신이 소유하는 UObject를 반환한다고 생각이 가기는 합니다.
이를 이해하기 위해 바로 코드부터 보겠습니다.
MyTestActor.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyTestActor.generated.h"
UCLASS()
class TESTSTUDY_API AMyTestActor : public AActor
{
GENERATED_BODY()
public:
AMyTestActor();
protected:
virtual void BeginPlay() override;
public:
virtual void Tick(float DeltaTime) override;
private:
UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category=Custom, meta=(AllowPrivateAccess=true))
class UStaticMeshComponent* SMComp;
};
// BeginPlay
void AMyTestActor::BeginPlay()
{
Super::BeginPlay();
UObject* Outer = this;
while (Outer != nullptr)
{
// 현재 객체의 이름을 로그에 남깁니다. 의사코드로 작성하겠습니다.
UE_LOG(LogTemp, Log, TEXT("Current Object Class : %s"), *Outer->GetClass()->GetName());
Outer = Outer->GetOuter();
}
}
이후 MyTestActor를 상속받는 BP_MyTestActor를 테스트 레벨에 배치해서 로그를 확인해보면
LogTemp: Current Object Class : MyTestActor
LogTemp: Current Object Class : Level
LogTemp: Current Object Class : World
LogTemp: Current Object Class : Package
이렇게 로그들이 찍히는 것을 확인할 수 있습니다.
이를 통해 Level이 Actor를 소유하고 있고 World가 레벨을 소유하고 있으며 Package가 World를 소유하는 관계로 볼 수 있습니다.
위의 SMComp또한 마찬가지로
AMyTestActor::AMyTestActor()
{
PrimaryActorTick.bCanEverTick = false;
PrimaryActorTick.bStartWithTickEnabled = false;
SMComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("SK"));
}
SmComp의 GetOuter()는 MyTestActor가 되는 것입니다.
이런식으로 Outer Chain이 연결되어 있으며 OuterChain을 GetOuter()라는 함수를 통해서 어떤 패키지에 소유되어 있는지 알수 있으며, 또한 Outer()는 GC에 유용한 정보를 제공합니다.
그림으로 이해를 해보자면
요로코롬 되겠네요.
아래 이득우님 블로그는 꼭 읽으신 다음에 이해하는 것이 좋을거같습니다.
[1-7] 언리얼 오브젝트의 계층 구조 : 네이버 블로그 (naver.com)
참고 블로그
'UE5' 카테고리의 다른 글
[UE] FObjectInitializer (1) | 2024.01.02 |
---|---|
[UE] ArcheType (0) | 2023.12.31 |
[UE] StaticClass (0) | 2023.11.29 |
[UE] Unreal5 Live Coding쓰면 지양??해야 하는 이유 (+빌드) (0) | 2023.05.02 |
[UE] Unreal5 TObjectPtr<>, TSubclassOf<> 에 대해 (0) | 2023.04.20 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!