https://dev.epicgames.com/documentation/ko-kr/unreal-engine/referencing-assets-in-unreal-engine

 

언리얼 엔진의 에셋 참조 | 언리얼 엔진 5.4 문서 | Epic Developer Community

언리얼 엔진은 에셋 참조 방식과 메모리에 로드되는 익스텐션을 통해 제어할 수 있는 다양한 메커니즘을 제공합니다.

dev.epicgames.com

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를 해주는 편이 안전하다.

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을 사용

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

+ Recent posts