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 는 자동으로 원시 포인터 타입으로 변환됩니다. 위에 설명한 것과 같이 사소한 코드를 수정이 필요한 경우가 간혹 있지만 대부분의 프로젝트에는 필요하지 않습니다.
'게임 개발 > Unreal Engine' 카테고리의 다른 글
[UE4] AActor 에디터에서 선택 Event 구현 (0) | 2022.06.09 |
---|---|
[UE5] Lyra 분석 - AnimBP Tour (0) | 2022.05.17 |
[UE5] Quixel Bridge가 보이지 않는 현상 수정 (0) | 2022.05.02 |
[UE4] DataTable->FindRow의 ContextString 의미? (0) | 2022.04.22 |
[UE4] 타입으로 모든 Asset 찾기 (0) | 2022.04.22 |