TObjectPtr 이란?
TObjectPtr은 원시 포인터를 대체하기 위한 UObject용 포인터입니다.
언리얼에서는 공식적으로
C++ 라이선스 사용자의 프로젝트에 원시 오브젝트 포인터를 사용하거나,
TObjectPtr을 선택적으로 사용할 수 있도록 합니다.
UE5에서는
템플릿 기반 64비트 포인터 시스템인 TObjectPtr를 도입하여 에디터 빌드를 지원합니다.
TObjectPtr의 기능
1. 에디터 빌드에 다이나믹 해상도와 액세스 트래킹을 추가하면서
( = 에디터 빌드에서 수행하는 기능이 있으며,)
비에디터 빌드의 원시 포인터와 동일한 역할을 수행합니다.
( = 비에디터 빌드에서 장애가 되지 아니함)
2. TObjectPtr 변수는 함수로 전달되가나 로컬 변수에 저장될 때
자동으로 원시 포인터로 변환됩니다.
(기능적 하자가 없음)
3. UPROPERTY 변수에 원시 포인터가 있엇던
만른 엔진 클래스에서 이제 TObjectPtr을 사용합니다.
이는 대부분 묵시적으로 TObjectPtr 은 원시 포인터로 변환되지만,
엔진 클래스 멤버 변수와의 적접적인 상호작용에서
원시 포인터 시맨틱을 TObjectPtr 시맨틱으로 변환해야하는 경우가 드물게 있기 때문입니다.
그럼 왜 TObjectPtr 를 사용해야 하는가?
선택 사항이긴 하지만 언리얼은 공식적으로
TObjectPtr 포인터 프로퍼티에 대한 T*와 UCLASS 및 USTRUCT 타입에 있는
컨테이너 클래스를 통해 TObjectPtr<T>를 사용하는 것을 권장합니다.
TObjectPtr 은 비에디터 빌드에 대한 원시 포인터로 변환되므로
동작 및 성능에 영향을 미치지 않기 때문입니다.
(반대로 생각하면 특정 원시포인터는 TObjectPtr 로 변환되지 않으므로
동작 및 성능에 영향을 미침)
언리얼에서 제안하는 포인터 사용방식
1. 컨테이너 함수 'Find' 패밀리를 호출할 때 T** 대신
TObjectPtr<T>* 를 사용하여 반환값을 캡처합니다.
2. 원시 포인터 컨테이너를 통한 범위 기반 반복작업에서 auto*를
이터레이터 변수 타입으로 사용했을 수 있습니다.
따라서 이를 auto&로 바꿔줍니다.
또한 새 코드에 auto& 또는 const auto&를 사용하는 것을 권장합니다.
TObjectPtr가 해결된 오브젝트 주소를 캐시한 이후에 액세스 시도에 소요되는 시간을 절약할 수 있기 때문입니다.
3. 원시 포인터가 필요하고 묵시적 변환을 사용할 수 없는 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());
}
참고 문서 UE5 공식문서
'UE5' 카테고리의 다른 글
디버깅에 도움되는 메소드 ensure 사용법 (0) | 2024.09.22 |
---|---|
Enhanced Input System Input Binding Process (향상된 인풋 시스템 인풋 바인딩 과정) (3) | 2024.09.16 |
엔진 커마 시작하는 법 (3) | 2024.09.08 |
Experience (1) | 2024.09.07 |
StaticClass, TSubClassOf, FSoftObjectPath, FScopeLock (2) | 2024.09.06 |