#1. 개념
1. TSoftObjectPtr
TSoftObjectPtr는 Unreal Engine에서 제공하는 스마트 포인터 중 하나로, 주로 에셋에 대한 참조를 관리하는 데 사용됩니다. TSoftObjectPtr는 주로 대용량 애셋의 지연 로딩, 순환 참조 방지, 모듈 간 느슨한 결합을 통한 애셋 참조를 관리하기 위해 활용됩니다.
2. 특징
- 지연 로딩: 객체를 즉시 로드하지 않고, 필요한 순간 로드하여 활용합니다.
- 약한 참조: 가비지 컬렉션을 방해하지 않아 메모리 관리에 유리합니다.
- 경로 기반: 객체에 대한 참조를 문자열 경로로 저장합니다.
- 비동기 로딩: 백그라운드에서 객체를 로드할 수 있어, 성능상 이점이 있습니다.
3. 동작 방식
- 먼저, 스마트 포인터가 참조하는 객체를 로드하지 않은 상태에서, 경로 정보만 갖고 있습니다.
- LoadSynchronous() 혹은 LoadAsyn()를 통해 실제 객체를 지연 로딩 혹은 비동기 로딩합니다.
- 로딩 작업을 마치고, Get()을 통해 객체에 접근할 수 있습니다.
4. 코드
1. 주의할 점
// 오류가 있는 원본 코드
private:
UImage* SomeImage;
TSoftObjectPtr<UTexture2D> SomeTexture;
void SomeFund()
{
if(!SomeImage)
{
return;
}
if(SomeTexture.Get()) // 오류 발생 지점
{
SomeImage->SetBrushFromTexture(SomeTexture.LoadSynchronous()); // 오류 발생 지점
}
}
// 수정된 코드
private:
UImage* SomeImage;
TSoftObjectPtr<UTexture2D> SomeTexture;
void SomeFund()
{
if(!SomeImage)
{
return;
}
if(!SomeTexture.IsNull()) // TSoftObjectPtr에 대해 올바른 검사 방법
{
if(UTexture2D* LoadedTexture = SomeTexture.LoadSynchronous())
{
SomeImage->SetBrushFromTexture(LoadedTexture);
}
}
//혹은
UTexture2D* LoadedTexture = SomeTexture.LoadSynchronous();
if(LoadedTexture)
{
//...다음 작업 진행
}
}
LoadSynchronous() 혹은 LoadAsync() 호출 이전에 TSoftObjectPtr 유형에 대한 유효성 검사는 항상 실패할 확률이 높습니다. TSoftObjectPtr는 참조하고자 하는 애셋의 경로 정보만을 갖고 있으며, isValid 호출은 null값을 반환할 수 있습니다. 따라서,. IsNull() 호출 혹은 LoadSynchronous() 호출을 통해 정상적으로 객체가 로드되었는지 확인하는 코드를 작성해야 합니다.
'게임개발 > Unreal C++' 카테고리의 다른 글
[Unreal]#Delegate 바인딩 시 추가 매개변수(인자 바인딩) (0) | 2024.10.04 |
---|---|
[Unreal]#FInputMode (2) | 2024.09.08 |
[Unreal]#UI 최적화 (1) | 2024.08.28 |
[Unreal]#UFUNCTION 매크로 (0) | 2024.08.28 |
[Unreal]#비동기 프로그래밍 (0) | 2024.08.21 |