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를 가져올 수 있었습니다.
'Unreal Engine > [EpicGames] UE5 기본 문법' 카테고리의 다른 글
5. EditDefaultsOnly의 ArchiType과 Instance의 의미 (0) | 2024.11.17 |
---|---|
4. Blueprint Callable 키워드 (0) | 2024.11.17 |
3. Blueprintable과 BlueprintType의 차이 (3) | 2024.11.13 |
1. TSubclassOf (1) | 2024.10.13 |
댓글