10
21

다음은 언리얼 에서 제공하는 언리얼 오브젝트의 스마트 포인터이다. 

 

TObjectPtr (강한 참조)

액터가 로딩될 때 액터의 멤버변수로 TObjectPtr 이 있다면 같이 로딩된다.

유니티에서 인스펙터에 다른 프리팹의 레퍼런스가 있다면 같이 메모리에 로딩되는 것과 같은 구조다.

 

TSoftObjectPtr (느슨한 참조)

액터가 로딩되어도 직접 로드하기 전까지는 메모리에 로딩하지 않는다.

유니티에서 어드레서블 레퍼런스만 물려있다면 직접 로딩할 때 메모리에 올리는 것과 같은 구조이다.

 

TObjectPtr은 내부에 있는 객체를 바로 접근가능했지만 

소프트 레퍼런스인 TSoftObjectPtr은 객체가 로딩 되었는지 안되었는지 알 수 없기 때문에

IsPending() 으로 확인하고, LoadSynchronous() 로 로딩하고, Get() 으로 가져와야한다.

if (WeaponItemData->WeaponMesh.IsPending())
{
    WeaponItemData->WeaponMesh.LoadSynchronous();
}

Weapon->SetSkeletalMesh(WeaponItemData->WeaponMesh.Get());

 

TWeakObjectPtr (약한 참조)

C++의 스마트 포인터에서도 있었던 Weak 참조이다.

객체의 수명에 영향을 주지 않아 순환 참조 문제를 해결하기 위해 만들어졌다.

 

하위 오브젝트로 다른 액터를 참조하는 경우 해당 액터들이 삭제되어도 참조 때문에 메모리에서 내리지 않는 문제가 있는데

WeakObjectPtr은 수명에 영향을 주지 않아 메모리에서 해제가 가능하다.

 

IsValid() 로 확인하고 Get()으로 사용한다.

if (MyTestClassRef.IsValid())
{
    MyTestClass* ValidItemBox = MyTestClassRef.Get();
}

 

 

COMMENT