[언리얼 엔진] 애셋 참조

    애셋 참조

    강참조는 오브젝트 A가 오브젝트 B를 참조하여 A로드 시 B도 로드되게 한다.
    약참조는 오브젝트 A가 오브젝트 B를 경로같은 문자열 형태로 참조하게 만드는 형태이다.

    직접 프로퍼티 참조

    애셋 참조의 가장 흔한 경우는 UPROPERTY 매크로를 통해 노출시키고 디자이너가 해당 애셋에 블루프린트나 월드 인스턴스를 통해서 지정한다.

    /** construction start sound stinger */
    
    UPROPERTY(EditDefaultsOnly, Category=Building)
    
    USoundCue* ConstructionStartStinger;

    생성 시간 참조

    오브젝트 생성시 프로퍼티를 일부분으로 설정하는 방식이다. ConstructorHelpers 클래스를 사용하여 생성 단계 도중 오브젝트와 오브젝트 클래스를 찾는다.

    /** 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;
    
        ...
    
    }

    간접 프로퍼티 참조

    TSoftObjectPtr을 이용하여 애셋 로드 시점을 제어한다. 디자이너는 직접 프로퍼티 레퍼런스인 것처럼 작업이 가능하다. 하지만 애셋을 수동으로 로드해야한다. LoadObject<>()StaticLoadObject()FStreamingManager를 사용하여 오브젝트를 로드한다.

    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();
    }

    오브젝트 검색/로드

    이미 생성되거나 로드된 UObject는 FindObject<>()를 사용하여 찾을 수 있다 LoadObject<>()는 내부적으로 FindObject와 동일한 역할을 하기에 FindObject를 먼저 호출할 필요가 없다.

    AFunctionalTest* TestToRun = FindObject<AFunctionalTest>(TestsOuter, *TestName);
    GridTexture = LoadObject<UTexture2D>(NULL, TEXT("/Engine/EngineMaterials/DefaultWhiteGrid.DefaultWhiteGrid"), NULL, LOAD_None, NULL);
    
    //UClass 로드 전용
    DefaultPreviewPawnClass = LoadClass<APawn>(NULL, *PreviewPawnName, NULL, LOAD_None, NULL);
    //위와 동일한 동작
    DefaultPreviewPawnClass = LoadObject<UClass>(NULL, *PreviewPawnName, NULL, LOAD_None, NULL);
    
    if (!DefaultPreviewPawnClass->IsChildOf(APawn::StaticClass()))
    {
        DefaultPreviewPawnClass = nullptr;
    }
    반응형

    댓글

    Designed by JB FACTORY