본문 바로가기
Unreal Engine/[EpicGames] UE5 기본 문법

2. GetOuter

by 헛둘이 2024. 10. 13.

Lyra Camera 기법 중에 GetOuter라는 구문이 나와서 궁금하던 차에 찾아보게 되었고, 기록해두려고 합니다.

GetOuter는 단순히 멤버 변수 OuterPrivate를 반환해주는 함수인데요, 이 멤버변수는 어디에서 설정되는가 하면,

오브젝트가 생성될 때 첫 번째 인자로 들어가게 되고, 

 

단순 대입을 통해 이루어지게 됩니다.

 

TMI로 FStaticConstructObjectParameters를 이용하여 인자를 전달하는 이유는 AutoRTFM라는 기법을 사용하기 위함인데, UObject를 생성할 때 별도의 검사를 진행하지 않고 생성하기 위함입니다.

그리고 생성 도중 뭔가 문제가 생겨서 중단되어야 하면, GC를 이용해서 자동으로 정리해줍니다.

 

이 부분은 자체 엔진 개발 시 Factory에 구현한 CreateObject<T>와 연관시켜서 쉽게 이해할 수 있었습니다.

실제 오브젝트가 생성될 때 MeshRenderer, Rigidbody, Collider 등등 다양한 컴포넌트들이 붙어야 했는데,

오브젝트마다 그걸 하나 하나 해줄 수 없으니 몇 개의 헬퍼 함수로 간소화시켜서 구현했던 기억이 있습니다.

제가 만든 엔진의 경우 생성 도중에 실패하게 되면 바로 크래시를 내서 즉시 인지할 수 있도록 했습니다.

 

UHmCameraMode* UHmCameraModeStack::GetCameraModeInstance(TSubclassOf<UHmCameraMode>& CameraModeClass)
{
	check(CameraModeClass);

	for (UHmCameraMode* CameraMode : CameraModeInstances)
	{
		if ((CameraMode != nullptr) && (CameraMode->GetClass() == CameraModeClass))
		{
			return CameraMode;
		}
	}

	UHmCameraMode* NewCameraMode = NewObject<UHmCameraMode>(GetOuter(), CameraModeClass, NAME_None, RF_NoFlags);
	check(NewCameraMode);

	CameraModeInstances.Add(NewCameraMode);
	return NewCameraMode;
}

 

이 코드는 CameraModeStack에서 CameraModeInstance를 가져올 때 캐싱되어 있는 카메라 모드를 가져오는 함수인데요. (캐싱되어 있지 않으면 캐싱한 후 반환)

 

NewCameraMode를 생성할 때 NewObject<UHmCameraMode>의 인자로 GetOuter()가 들어오게 됩니다.

GetOuter는 현재 CameraModeStack을 소유한 Object가 됩니다.

 

여기서 등장하는 GetOuter는 CameraModeStack을 보유한 CameraComponent가 됩니다.

 

이전에 자체 엔진을 구현할 때 Unity Engine의 GameObject - Component 패턴을 모방하여 구현하였는데,

Outer도 같은 개념이라고 생각하면 이해가 편할 것 같습니다.

다만 SetOwner(this)Object->Owner = this와 같은 개념이 아니라 생성할 때 인자로 넘긴다는 부분이 차이가 있습니다.

 

다시 돌아와서, GetOuter를 사용해서 Object를 생성한 이유는, 이후에 이렇게 CameraComponent를 사용하기 위해서였네요.

UHmCameraComponent* UHmCameraMode::GetHmCameraComponent() const
{
	return CastChecked<UHmCameraComponent>(GetOuter());
}

 

정리하면, CameraComponent를 통해 Actor를 가져와서 별도의 처리를 하기 위해 CameraMode 오브젝트 생성 시 GetOuter를 Outer인자로 넣어 생성하였고, 여기서 Outer로 들어간 건 CameraModeStack의 Outer인 CameraComponent가 들어갔습니다.

 

여기서 CameraMode의 GetOuter를 호출하니, 생성할 때 넣었던 Outer인 CameraComponent가 반환되고,

그 CameraComponent를 통해 GetActor를 가져올 수 있었습니다.

댓글