언리얼 엔진에서 사용하는 Pointer에 대해 알아보자
크게 두 가지로 분류할 수 있다.
당연히 Garbage Collector에 의해 관리되는 포인터를 뜻한다.
여기에도 두 가지가 있는데, 강력 / 약한 이렇게 분류된다.
UObject에 대해 ‘hold’ 혹은 ‘dependent’
즉, 점유하고 있는 상태를 말한다.
이런 Hard Object Pointer가 모두 사라져야 GC가 UObject를 할당 해제한다.
⇒ 얘가 잡고있으면 GC가 삭제하지 않음.
UPROPERTY() UObject* Pointer = nullptr;
IsValid(Pointer) // 유효성 판별
얘는 UObject를 소유하지 않음.
그래서 GC가 얘가 있는 것을 모른다.
그래서 Weak Pointer가 Object를 pointing하고 있어도, GC가 삭제할 수 있다.
그렇기 때문에 weakPointer로 선언한 pointer에 접근할 때에는 항상 유효성 판별이 필요
TWeakObjectPtr<UObject> Pointer;
IsValid(Pointer) // 유효성 판별
Weak Object Pointer 처럼 얘도 소유하지 않는 약한 pointing을 한다.
TSoftObjectPtr<UObject> Pointer;
그런데 Weak Pointer와 차이점이 무엇이냐 하면,
얘는 어떤 instance를 pointing할 때, 메모리 주소 값 & asset의 주소 를 저장한다.
이것이 무슨 말이냐.
해당 UObject가 사용하는 Asset의 주소를 저장한다는 것.
때문에 Runtime에 에셋을 불러오는 것에 도움을 준다.
TSoftObjectPtr<UTexture2D> ItemImage;
ItemImage = "/Game/Textures/ItemTexture.ItemTexture";
ItemImage.LoadSynchronous(); // 이미지 Texture를 로드
자 그러면 이제 관리되지 않는 포인터를 함 보자.
기본적으로 C++이 제공하는 SmartPointer랑 거의 유사하다고 생각하면 될 것 같다.
reflection에 알리는 것이 아니라 자체적으로 동작하는 것.
다만, UObject를 사용할 수 없다. 대신 FObject를 사용한다.
TUniquePtr<FObject> Pointer;
일반적인 Unique Pointer의 역할을 한다.
한 시점에 오직 하나의 Unique Pointer만 객체를 소유함
더 이상 객체를 소유하지 않거나, 다른 Unique Pointer가 객체를 소유하면 사라짐
TSharedPtr<FObject> Pointer;
객체를 가리키는 Pointer가 0이 되면 사라짐.
TWeakPtr<FObject> Pointer;
객체를 소유하지 않는 포인터
FObject* Pointer = nullptr;
그냥 원시적인 형태의 포인터 방식
여기에 UPROPERTY 매크로만 붙이면 Hard Object Pointer가 된다.
참조
https://unrealcommunity.wiki/pointer-types-m33pysxg
🪣UNREAL Containers - TArray (0) | 2024.02.09 |
---|---|
🆎Unreal에서의 StringHandling(FName, FText, FString) (0) | 2024.02.08 |
🗑️언리얼의 GC (Garbage Collection) (0) | 2024.02.07 |
👾 UStruct , UObject , UClass (0) | 2024.02.07 |
언리얼 형변환(과 CPP 형변환 , Cast) (0) | 2024.02.07 |
댓글 영역