게임 개발/Unreal Engine

[UE5] TObjectPtr<T> 소개

지노윈 2022. 5. 10. 22:19
반응형

UE5에서는 의무가 아닌 선택사항으로 Raw 포인터 대신에 TObjectPtr를 사용하는 것을 권장하고 있습니다.

예를 들어 USceneComponent* 는 TObjectPtr<USceneComponent>로 선언하여 사용합니다.

 

  • 에디터 빌드에 다이내믹 해상도와 액세스 트래킹을 추가하면서 생겨났다.
  • 함수의 파라미터나 로컬 변수로 사용시 Raw 포인터로 자동 변환 됩니다.
  • 제품의 동작 또는 성능에는 영향을 미치지 않지만, 더 나은 에디터 빌드에서의 개발 경험을 할 수 있습니다.

 

https://docs.unrealengine.com/5.0/ko/unreal-engine-5-migration-guide/

C++ 오브젝트 포인터 프로퍼티

다음 섹션은 C++ 코드를 사용하는 프로젝트에만 적용되나, C++ 프로젝트 대부분은 수정할 필요 없이 컴파일됩니다. 블루프린트 비주얼 스크립팅 사용자는 어떠한 작업도 할 필요가 없습니다.

 

UE5는 에디터 빌드의 원시 오브젝트 포인터에 대한 선택적 대체로 템플릿 기반 64비트 포인터 시스템인 TObjectPtr 를 도입합니다. 이 시스템은 에디터 빌드에 다이내믹 해상도와 액세스 트래킹을 추가하면서 비에디터 빌드의 원시 포인터와 동일한 역할을 합니다. TObjectPtr 변수는 또한 함수로 전달되거나 로컬 변수에 저장될 때 자동으로 원시 포인터로 변환됩니다. UPROPERTY 변수에 원시 포인터가 있었던 많은 엔진 클래스에서 이제 TObjectPtr 를 사용합니다. TObjectPtr 타입과의 상호작용 대부분이 묵시적으로 원시 포인터로 변환되지만, 엔진 클래스 멤버 변수와의 직접 상호 작용에서 원시 포인터 시맨틱을 TObjectPtr 시맨틱으로 변환해야 하는 경우가 드물게 있습니다. 예를 들어 UE4에서 AActor  RootComponent 프로퍼티는 USceneComponent* 였지만, UE5에서는 TObjectPtr<USceneComponent> 입니다. 드물게 USceneComponent* 반환 타입을 갖는 GetRootComponent 호출이 항상 그대로 유지될 수 있지만, RootComponent 와의 직접 상호작용을 업데이트해야 할 수도 있습니다.

선택 사항이기는 하지만, UObject 포인터 프로퍼티에 대한 T*  UCLASS  USTRUCT 타입에 있는 컨테이너 클래스를 통해 TObjectPtr<T> 를 사용하는 것이 좋습니다. TObjectPtr 는 비에디터 빌드에 대한 원시 포인터로 변환되므로 출시된 제품의 동작 또는 성능에는 영향을 미치지 않지만, 더 나은 에디터 빌드에서의 개발 경험을 할 수 있습니다. 다음의 방식을 따라 여러분의 프로그래밍 스타일을 이 새로운 포인터 시스템에 맞추세요.

  • 컨테이너 함수의 ‘Find' 패밀리를 호출할 때 T** 대신 TObjectPtr<T>* 를 사용하여 반환 값을 캡처합니다.
  • 원시 포인터 컨테이너를 통한 범위 기반 반복작업에서 auto* 를 이터레이터 변수 타입으로 사용했을 수 있습니다. 이를 auto& 로 바꿉니다. 또한 새 코드에서 auto& 또는 const auto& 를 사용하는 것을 권장합니다. TObjectPtr 가 해결된 오브젝트 주소를 캐시하고 이후 액세스 시도에 소요되는 시간을 절약할 수 있습니다.
  • 원시 포인터가 필요하고 묵시적 변환을 사용할 수 없는 경우 TObjectPtr 에서 ToRawPtr 또는 Get 을 호출합니다. 일반적인 사례로는 const_cast 내부의 3항 연산 및 사용이 있습니다. 함수 델리게이트로 파라미터를 전달할 때 평행 델리게이트 함수를 패스스루로 선언하고, 원시 포인터를 TObjectPtr 파라미터로 대체합니다. 다음 예시에서는 패스스루 델리게이트 함수를 보여줍니다.
  • // 대부분의 사례에서 사용할 원시 포인터를 사용하는 원본 함수 시그니처: static bool MyFunction(UObject* FirstParameter); // 드물지만 묵시적 변환을 사용할 수 없을 때 이 패스스루 함수를 사용합니다. // TObjectPtr를 사용하는 패스스루 함수 시그니처: static bool MyFunction(TObjectPtr<UObject> FirstParameter); // (소스 파일의) 패스스루 함수 바디: bool UMyClass::MyFunction(TObjectPtr<UObject> FirstParameter) { return ShouldShowResetToDefault(FirstParameter.Get()); }

파라미터를 함수에 전달하거나 로컬 변수에 데이터를 저장하는 등과 같은 대부분의 경우 TObjectPtr 는 자동으로 원시 포인터 타입으로 변환됩니다. 위에 설명한 것과 같이 사소한 코드를 수정이 필요한 경우가 간혹 있지만 대부분의 프로젝트에는 필요하지 않습니다.