https://dev.epicgames.com/documentation/ko-kr/unreal-engine/referencing-assets-in-unreal-engine
Hard Reference
- Object A가 Object B를 직접 참조
- Object A가 Load 되면 Object B도 같이 Load 됨.
- 신경쓰지 않으면 다수의 Asset이 한꺼번에 Load되어 메모리를 크게 잡아먹을 수 있다.
Direct Property Reference
- 가장 흔한 방법
- UPROPERTY 매크로로 노출되며, 노출된 것을 Designer가 다음 두 가지 방법으로 Architype을 지정한다.
- Blueprint 상속
- World에 배치된 Instance
-
- EditDefaultsOnly 키워드를 입력하면 Property는 한 Object의 Default Property 일부로서만 설정 가능하다.
- 위 ConstructionStartStinger는 USoundCue나 그 자식 Class만 Architype을 지정할 수 있다.
- 더보기
/** construction start sound stinger */ UPROPERTY(EditDefaultsOnly, Category=Building) USoundCue* ConstructionStartStinger;
Construction Time Reference
- 다음 2가지 조건을 만족 할 때 보통 사용 됨
- Programmer가 Load 해야 할 Asset을 정확히 알고 있을 때
- 그 Property를 Object 생성 시 일부분으로 설정하는 경우
- ConstructorHeleprs라는 Class를 사용
- 생성 단계 도중 Object와 Object의 Class를 찾음
-
더보기
/** gray health bar texture */ UPROPERTY() class UTexture2D* BarFillTexture; AStrategyHUD::AStrategyHUD(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { static ConstructorHelpers::FObjectFinder<UTexture2D> BarFillObj(TEXT("/Game/UI/HUD/BarFill")); ... BarFillTexture = BarFillObj.Object; ... }
- 위 ConstructorHelpers Class는 Memory에서 Asset을 Search하고, 없을 경우 Load 한다.
- Load 할 때에는 Asset에 대한 전체 경로를 사용한다.
- Asset이 존재하지 않거나, 오류로 Load 할 수 없는 경우, Property가 nullptr로 설정된다.
- 때문에 항상 사용하기 전에 Validation Check를 해주는 편이 안전하다.
- 위 ConstructorHelpers Class는 Memory에서 Asset을 Search하고, 없을 경우 Load 한다.
Soft Reference
Indirect Property Reference
- TSoftObjPtr을 이용
- Designer의 경우, 직접 Property Reference인 것처럼도 작업할 수 있다.
- 하지먼 직접 Pointer Reference를 사용하는 대신,
Asset의 Load 여부에 대한 검사가 가능한 Template 코드와 함꼐 Property가 String으로 저장 된다.
- 수동으로 Load 해야 한다.
- LoadObject<>()나 StaticLoadObject(), FStreamingManager() Object를 이용해 Load 가능
- LoadObject<>(), StaticLoadObject()는 Synchronous하기 때문에 Frame에 영향을 줄 수 있다.
- GamePlay에 영향을 끼치지 않을 것이 확실한 것에만 사용하자.
-
더보기
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category=Building) TSoftObjectPtr<UStaticMesh> BaseMesh; UStaticMesh* GetLazyLoadedMesh() { if (BaseMesh.IsPending()) { const FSoftObjectPath& AssetRef = BaseMesh.ToStringReference(); BaseMesh = Cast< UStaticMesh>(Streamable.SynchronousLoad(AssetRef)); } return BaseMesh.Get(); }
- TSoftObjPtr을 사용해 Runtime에서 Mesh를 지연시켜 Load
- Load 되었는지 여부 확인
- Load가 안 되어 있으면 FStreamingManager::SynchronousLoad로 Load
- Load가 되어 있으면 TSoftObjPtr 안의 UStaticMesh Pointer 반환
- 위와 같은 방식으로 UClass를 유예식으로 Load 할 수 있다.
- TAssetSubclassOf을 대체하여 TSoftClassPtr을 사용
- TSoftObjPtr을 사용해 Runtime에서 Mesh를 지연시켜 Load
Find/Load Object
- UPROPERTY 기반이 아니라 Runtime 상에서 String을 통해 Object Reference를 구할 때 사용하는 방법 중 하나
- 다른 하나는 FindObject<>()로, 이미 Create/Load 된 UObject에서만 사용 할 때 유용함
- 여기서 소개할 LoadObject<>()는 아직 Load되지 않은 Object에 적합함.
- 내부에서 FindObject<>()와 동일한 역할을 수행하기 때문에 별도의 Find 과정이 불필요하다.
-
더보기
DefaultPreviewPawnClass = LoadObject<UClass>(NULL, *PreviewPawnName, NULL, LOAD_None, NULL); if (!DefaultPreviewPawnClass->IsChildOf(APawn::StaticClass())) { DefaultPreviewPawnClass = nullptr; }
'UE5 > Architecture' 카테고리의 다른 글
[Architecture] String (0) | 2024.05.06 |
---|---|
[Architecture] Asset Registry (1) | 2024.05.06 |
[Architecture] Module(+ Package) (0) | 2024.05.03 |
[Architecture] DataAsset과 Asset Manager (0) | 2024.05.03 |
[Architecture] Async Asset Loading (0) | 2024.05.03 |