https://dev.epicgames.com/documentation/ko-kr/unreal-engine/asset-registry-in-unreal-engine

 

언리얼 엔진의 에셋 레지스트리 | 언리얼 엔진 5.4 문서 | Epic Developer Community

언리얼 엔진 에디터에서 에셋을 검색하는 방법과 에셋을 로드하기 전에 에셋 유형에 대해 자세히 알 수 있는 방법을 설명합니다.

dev.epicgames.com

  • Editor가 Load되면서 Load되지 않은 Asset에 대한 정보를 Asynchronous하게 모드은 Editor Subsystem
    • Editor가 Asset을 Load하지 않고 List를 만들 수 있도록 Memory에 저장
    • 이 정보는 Authoritative하고 Memory의 Asset이나 Disk의 File이 변경 시 자동으로 최신화가 된다.
    • 주로 Contents Browser에서 쓴다.
      • 하지만 Editor Code 어디에서도 사용은 가능하다.

Asset List 구하기

  • 더보기
    	FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
    	TArray<FAssetData> AssetData;
    	const UClass* Class = UStaticMesh::StaticClass();
    	AssetRegistryModule.Get().GetAssetsByClass(Class->GetFName(), AssetData);
  • Asset의 Load/Unlaod 여부는 FAssetData로 반환한다.
  • 또한 FAssetRegistryModule(정확히는 IAssetRegistry)에서 아래 함수로 Category 별  List를 만들 수 있다.

FAssetData를 UObject*로 변환하기

Filter

  • GetAssets() 함수를 호출할 때 FARFilter를 사용해 여러 Category 별 Filtering 되는 Asset List를 만들 수 있다.
  • 하나의 Component에는 Element가 여러개 있을 수 있다.
    • Asset은 ARFilter의 모든 Component를 충족해야 한다.
    • 하나의 Component를 충족시키려면, Asset은 그 안의 Element 아무것에나 일치하면 된다.

TagAndValue

  • FAssetData가 나타내는 Asset의 Property Value와 관련된 값
  • Asset이 저장되면서 안에 들어있는 UAsset 파일의 Header에 기록될 때 수집 된다.
    • UPROPERTY(AssetRegistrySearchable)이 선언된 것들에 대해서만 수집한다.
    • 더보기
      	/** 이 텍스처를 샘플링할 때 사용할 텍스처 필터링 모드입니다. */
      	UPROPERTY(Category=Texture, AssetRegistrySearchable)
      	TEnumAsByte<enum TextureFilter> Filter;
      • 위 변수는 저장 될 때 Key는 "Filter"로, Value는 "TF_Linear"와 같은 enum TextureFilter의 문자열을 갖는다.
  • Asset Registry는 이 Header를 읽고 그에 맞게 TagAndValues를 채운다.
    • 반드시 저장을 해야 Asset Registry가 Property를 발견할 수 있다.
  • Asset Registry가 UPROPERTY가 아닌 정보를 검색 하게 할 수도 있다.
    • GetAssetRegistryTags()를 구현하여 TagsAndValues에 값을 수동으로 추가해준다.
    • 이 함수는 UObject에서 제공한다.

Asyncronous Data Discovery

  • Asset Registry는 UAsset 파일을 Async Load로 읽는다.
    • 때문에 요청한 시간에 모든 Asset List 전체가 없을 수 있다.
  •  Editor 코드에서는 전체 List를 요청하면 Registry에서 Asset과 관련된 여러 Delegate Call-back을 제공한다.
    • 더보기
      	/** 레지스트리에 에셋이 추가될 때에 대한 콜백을 등록/해제합니다.  */
      	virtual FAssetAddedEvent& OnAssetAdded() = 0;
       
      	/** 레지스트리에서 에셋이 제거될 때에 대한 콜백을 등록/해제합니다. */
      	virtual FAssetRemovedEvent& OnAssetRemoved() = 0;
       
      	/** 레지스트리에 에셋 이름이 변경될 때에 대한 콜백을 등록/해제합니다. */
      	virtual FAssetRenamedEvent& OnAssetRenamed() = 0;
       
      	/** 에셋 레지스트리가 파일 로드를 완료했을 때에 대한 콜백을 등록/해제합니다. */
      	virtual FFilesLoadedEvent& OnFilesLoaded() = 0;
       
      	/** 백그라운드 파일 로드 진행상황 업데이트를 위한 콜백을 등록/해제합니다. */
      	virtual FFileLoadProgressUpdatedEvent& OnFileLoadProgressUpdated() = 0;
       
      	/** 현재 에셋 레지스트리가 파일을 로드중이라 모든 에셋에 대해 알지 못하면 참을 반환합니다. */
      	virtual bool IsLoadingAssets() = 0;
  • 더보기
    	void FMyClass::FMyClass()
    	{
    		// 업데이트 감지를 위해 에셋 레지스트리 모듈을 로드합니다.
    		FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
    		AssetRegistryModule.Get().OnAssetAdded().AddRaw( this, &FMyClass::OnAssetAdded );
    	}
     
    	FMyClass::~FMyClass()
    	{
    		// 델리게이트 등록해제를 위해 에셋 레지스트리 모듈을 로드합니다.
    		FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
    		AssetRegistryModule.Get().OnAssetAdded().RemoveAll( this );
    	}
     
    	void FMyClass::OnAssetAdded(const FAssetData& AssetData)
    	{
    		// 에셋 레지스트리가 에셋을 발견했습니다.
    		// 즉 방금 생성되었거나 방금 디스크에서 찾았다는 뜻입니다.
    		// 이 함수의 코드가 빠른지 확인, 아니면 수집 프로세스가 늦춰집니다.
    	}
    • Asset Registry는 Commandlet에서도 사용될 수 있다.
      • 하지만 정보가 Async Load되지 않아 Load가 완료될 때까지 LoadModule() 호출이 Block된다.
    • Code가 Asset을 Async하게 Discover하기 기다리면서 Slate UI가 있는 경우,
      진행 상황을 사용자에게 알리는 SAssetDiscoveryIndicator Widget이 들어있을 것이다.

'UE5 > Architecture' 카테고리의 다른 글

[Architecture] Programming Subsystem  (0) 2024.05.06
[Architecture] String  (0) 2024.05.06
[Architecture] Asset Reference  (0) 2024.05.06
[Architecture] Module(+ Package)  (0) 2024.05.03
[Architecture] DataAsset과 Asset Manager  (0) 2024.05.03

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

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-engine-modules

 

언리얼 엔진 모듈 | 언리얼 엔진 5.4 문서 | Epic Developer Community

모듈은 언리얼 엔진 소프트웨어 아키텍처의 구성 요소입니다. 코드를 모듈로 정리하여 더 효율적이고 유지보수하기 좋은 프로젝트를 만들 수 있습니다.

dev.epicgames.com

  • Unreal Engie Software Architecture에서 가장 기본적인 구성 요소
  • 특정 Editor Tool, Runtime Ability, Library 등의 기능을 독립된 코드 단위로 캡슐화
  • 모든 Project와 Plugin은 자체적인 Primary Module이 있다.
    • 하지만 이와 별개의 Module을 따로 정의하여 코드 정리를 할 수 있다.
  • C++ 20 Module과는 무관하다.

장점

  • 적절한 코드 분리를 강제하고 기능을 캡슐화 하여 구현을 숨긴다.
  • Module은 각기 다른 Compile Unit으로 Compile 되기 때문에 빌드 시간이 대폭 단축된다.
    • 변경되지 않은 Module은 컴파일 대상에서 제외된다.
  • Dependency Graph에서 서로 연결되며, IWYU 표준에 따라 Header에 실제 사용하는 코드만 포함하도록 제한한다.
    • 이는 컴파일 하는 도중 Project에서 사용하지 않는 Module은 안전하게 제외할 수 있다는 의미이기도 하다.
  • Runtime 중 지정한 Module의 Load/Unload 시간을 조절할 수 있다.
    • 이를 통해 활성화 할 시스템을 관리하여 Project의 Performance를 최적화 할 수 있다.
  • Compile 할 Platform 등 특정 조건에 따라 Project를 포함하거나 제외할 수 있다.

구성

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/how-to-make-a-gameplay-module-in-unreal-engine

 

언리얼 엔진에서 게임플레이 모듈을 만드는 방법 | 언리얼 엔진 5.4 문서 | Epic Developer Community

언리얼 엔진 게임의 런타임 모듈을 처음부터 생성하는 방법을 알아봅니다.

dev.epicgames.com

  1. Project의 Source 폴더 최상위 경로에 Module용 Directory 생성
    • 이 때, Directory의 이름은 Module의 이름과 동일해야 한다.
    • 만약 Source 폴더의 Sub Directory에 Module을 만드려 한다면,
      Module 이름도 Sub Directory를 모두 포함해야 한다.
  2. Module의 Root Directory에 [ModuleName].Build.cs 파일을 생성하고, 다른 Module과의 Dependency를 정의한다.
    • Dependency를 정의하면 UBS(Unreal Build System)에서 Module을 발견한다.
  3. Module의 Root Directory에 Private, Public 폴더를 생성한다.
  4. Private 폴더에 [ModuleName]Module.cpp 파일을 생성한다.
    • 이 파일을 통해 Module 및 Module 관리를 위한 일반 함수를 시작/중단할 수 있다.
  5. .uproject나 .uplugin 파일에 속한 Module에 환경설정 정보를 추가한다.
    • 추가하는 목적은 Module을 언제 Load할지 정하기 위해서다.
    • Name, Type, Platform, Loading Phase 정보가 포함되어야 한다.
  6. 이 Module을 사용해야 하는 모든 Module의 Build.cs 파일에 dependency로 Module을 나열한다.
    • Project Primary Module에 대한 Build.cs 파일이 포함될 수 있다.
  7. [Module].Build.cs 파일이 변경되거나, Source 파일이 다른 Folder로 옮길 때 아래 함수로 Solution 파일을 생성한다.
    1. GenerateProjectFiles.bat
    2. .uproject 우클릭 -> Generate Project Files
    3. Editor에서 File -> Refresh -> Visual Studio -> Project

구조 이해하기

  • 모든 Module은 Plugin이나 Project의 Source Directory에 위치해야 한다.
  • Module의 Root Folder는 해당 Module과 이름이 동일해야 한다.
  • Root Folder의 Module마다 다음 항목을 가지고 있어야 한다.
    • [ModuleName].Build.cs
    • Module의 C++ 코드
    • Private, Public 폴더

Build.cs 파일에서 Dependency 설정

  • UBS는 IDE Solution 대신 Target.cs 파일과 Module의 Build.cs 파일에 따라 빌드를 한다.
    • UBT가 IDE Solution를 무시한다.
    • 때문에 Solution을 인식하도록 하려면 모든 Module의 Root Directory에 [ModuleName].build.cs 파일을 배치해야 한다.
  • 더보기
    	using UnrealBuildTool; 
     
    	public class ModuleTest: ModuleRules 
     
    	{ 
     
    	public ModuleTest(ReadOnlyTargetRules Target) : base(Target) 
     
    	{ 
     
    	PrivateDependencyModuleNames.AddRange(new string[] {"Core"}); 
     
    	} 
     
    	}
  • DependencyModuleNames 목록에 Module Name을 추가하면 사용할 수 있는 Module이 Code에 설정된다.

PrivateDependencyModuleNames

  • .cpp 파일처럼 Module을 Private으로만 사용하는 경우
  • Project의 Compile 시간을 줄여주기에 어지간해서는 Private Dependency를 사용하는 것이 좋다.
  • Header File 내에서 Forward Declaration을 사용해 수 많은 Dependency를 Private로 만들 수 있다.

PublicDependencyModuleNames

  • .h 파일처럼 Module에 있는 Class를 사용하는 경우
  • 이 Module에 Dependency를 가진 다른 Module도 이 항목에 등록된 Module의 Class를 사용할 수 있다.

Private/Public Folder

  • Module이 일반 C++ Module인 경우,
    해당 Module의 Root Directory 하위의 Private/Public Folder에 C++ 파일을 배치해야 한다.
    • ModuleType이 .uproject 혹은 .uplugin에서 External로 설정되지 않은 경우
  • 이 파일들은 C++ 코드에서 제공하는 접근자와 관련이 없다.
    • 대신 다른 Module의 Module Code에 대한 이용성을 제어한다.
    • 보통 이런 Folder를 사용할 때에는 .cpp File이 Private Folder에 배치되어야 한다.
  • .h File을 Private Folder에 배치한 경우
    • 보유 중인 Module 외의 다른 Module에 노출되지 않는다.
  • .h File을 Public Folder에 배치한 경우
    • UBS가 Contents를 현재 Module에 Dependency를 가진 모든 Module에 노출한다.
    • 외부 Module의 Class는 Public Folder에 포함된 Class를 확장할 수 있다.
      • 때문에 Public Folder에 포함된 Class, Struct, Enum을 사용하는 Variable, Reference를 생성할 수 있다.
      • 또한 코드 단위에서 제공하는 C++ 접근자가 그대로 동작한다.
  • 다른 대상에 Dependency를 가지지 않는 Module을 작업하는 경우에는
    Private, Public Folder를 사용할 필요가 없다.
    • 단, 이 경우에는 Folder 외부 모든 Code는 Private Folder에 있는 것처럼 행동한다.
    • 대표적인 예시로 Game에서 Dependency Chain의 끝에 자주 위치하는 Primary Module이 있다.
  • Unreal Editor에서 New Class Wizard로 새 Class를 생성하면 자동으로 Folder간 병렬 구조를 형성해준다.

C++에서 Module 구현

  • Module을 나머지 C++ Project에 노출하려면 다음 두가지 작업이 필요하다.
    • IModuleInterface를 확장하는 Class 생성
    • IMPLEMENT_MODULE Macro에 추가
  • 가장 간단한 방법은 Private Directory의 Module에서 .cpp 파일을 생성하고,
    이름을 [ModuleName]Module.cpp로 지정하는 것
  • 더보기
    	#include "Modules/ModuleManager.h"
     
    	IMPLEMENT_MODULE(FDefaultModuleImpl, ModuleTest);
  • FDefaultModuleImpl
    • IModuleInterface를 확장하는 빈 class
    • .cpp File에 구현할 Class를 직접 작성하여 더 디테일한 구현이 가능
  • IModuleInterface에는 Load/Unload를 수행할 때 Trigger 되는 여러 함수가 포함되어 있다.
  • https://docs.unrealengine.com/4.26/en-US/API/Runtime/Core/Modules/IModuleInterface/
  •  
 

IModuleInterface

Interface class that all module implementations should derive from.

docs.unrealengine.com

Project에서 Module 사용하기

  • 신규 Unreal Engine Project나 Plugin을 생성할 때마다 자체적인 Primary Module이 Source Folder에 자동 생성된다.
    • 외부 Module은 Primary Module의 Build.cs에 추가하여 Project에 포함시킬 수 있다.
  • UBT는 Compile 속도를 최적화 하기 위해 Project의 Dependency Chain에서 발견 한 Module만 Compile 한다.
    • 즉,  그 어떠한 Project에서 사용하는 Build.cs 파일에 포함되어 있지 않으면 컴파일에서 제외된다.

Module Load 방식 제어

 

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/API/Runtime/Projects/EHostType__Type/?application_version=5.4

 

dev.epicgames.com

 

E Loading Phase/Type | Unreal Engine 5.4 Documentation | Epic Developer Community

Phase at which this module should be loaded during startup.

dev.epicgames.com

기타 파라미터

    • IncludelistPlatforms/ExcludelistPlatforms(배열)
      • 목록에 포함된 Platform에서 Comiple 할 Module을 포함/제외한다.
        • Win32
        • Win64
        • Mac
        • Linux
        • Android
        • IOS
    • IncludelistTargets/ExcludelistTargets(배열)
      • 목록에 포함된 Build Target에서 Comiple 할 Module을 포함/제외한다.
        • Game
        • Server
        • Client
        • Editor
        • Program
    • IncludelistTargetConfigurations/ExcludelistTargetConfigurations(배열)
      • 목록에 포함된 Build Configuration에서 Compile 할 Module을 포함/제외한다.
        • Debug
        • DebugGame
        • Development
        • Shipping
        • Test
    • IncludelistPrograms/ExcludelistPrograms(배열)
      • 특정 Program Name 범위 내에서 Compile 할 Module을 포함/제외한다.
    • AdditionalDependencies(배열)
      • Module에서 필요로 하는 Additional Dependency를 지정한다.
      • 대신, Build.cs 파일에서 지정해줘야 한다.

Module API 지정자

  • 가장 쉽게 생각해볼 수 있는 방법
    • Function/Class/Data를 자기 Module DLL 파일에 public인 것으로 Tag를 다는데 사용
  • 예를 들어 Engine Module에 있는 함수를 ENGINE_API로 마킹하면,
    Engine을 Import 하는 Module은 그 함수를 직접 접근할 수 있다.
    • 단, 이 방법은 Engine을 Modular Mode(Desktop에서의 DLL파일)로 Compile 할 때에만 사용된다.
  • 위와 반대로 모든 Code를 하나의 Exe 파일에 몰아 넣는 경우도 있다.
    • 이를 Monolithic Mode라 지칭한다.
  • Build Type은 UnrealBuildTool Setting이나 Platform, Build Configuration에 따라 제어된다.
  • 실제로 API 매크로는 UBT의 Compile 방식에 따라 다음과 같이 분류된다.
    • __declspec(dllexport).
      • Modular
    • __declspec(dllimport).
      • Import 중인 Module에 대한 Public Module Header를 포함할 때
    • __declspec().
      • Monolithic
  • API 매크로는 다른 Module에서 정적으로 Import 되는 Module에 대해서만 의미가 있다.
    • 대표적으로 "Core" Module이 있다.
    • UE4의 거의 모든 Module은 *.Build.cs 파일에 "Core"를 Import Dependency로 지정한다.
  • 다수의 Module은 절대 정적으로 Import 될 일 없다.
    • 대표적인 예로 "SceneOutliner" Module
  • 이러한 Module들은 "동적으로 Load 되는 Module"이라 지칭한다.
    • 이러한 Module들이 재밌는 점은 일종의 Plugin처럼 시동 시 발견되고, 종종 즉시 Reload가 가능하다.
  • API 매크로가 사용되는 곳은 대부분 이전 Code에서 새로운 Module이 그 DLL에서 Code에 접근하고자 할 때이다.
    • 새로운 Code에서는 API 매크로가 훨씬 적게 사용된다.
    • 그 대신 DLL 경계를 넘나들며 함수성을 노출시키는 예쁜 Interface Layer를 셋업한다.

Package

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/packaging-unreal-engine-projects

 

프로젝트 패키징 | 언리얼 엔진 5.4 문서 | Epic Developer Community

언리얼 게임 프로젝트의 배포용 패키지 만들기입니다.

dev.epicgames.com

  • .uasset, .umap 파일을 포함하는 Container
    • 게임 내 다양한 리소스(BP, Texture, Mesh 등)와 Level을 저장한다.
  • Package는 각 Asset의 수정사항을 추적하고, Asset 간의 Dependency를 관리하는데 사용된다.
  • Directory 설정에 따른 성능이 천차만별이기 때문에 Directory 정리를 잘 해줘야 한다.

Configuration

  1. Contents Directory 구조 정의
    • Project의 Content Directory 안에 구조를 설정한다.
      • 반드시 Content Directory에 직접 설정 될 필요 없고, Sub Folder를 사용해도 된다.
  2. Asset 관리
    • 각 Folder 내에 관련된 Asset을 Group으로 나눈다.
      • 예를 들어, 특정 Character에 대한 모든 Asset(BP, Texture, Animation 등)을 한 Folder 내에 저장한다.
      • 이 방식은 논리적인 구조를 통해 팀원이 필요한 Asset을 쉽게 찾고, 관리할 수 있도록 한다.
  3. Dependency, Reference 관리
    • Asset간의 Dependency를 적절히 관리하기 위해 Unreal Engine의 Asset Manager를 사용한다.
    • Asset Manager는 Project의 모든 Asset간의 Dependency를 추적하고,
      필요한 Asset만 Load하여 불필요한 Load를 줄인다.
  4. Compile, Build Optimization
    • UBS는 변경된 Asset만 Compile/Build한다.
    • 따라서 Package 단위로 Asset을 관리하면 특정 부분의 수정이 전체 Build에 미치는 영향을 최소화 할 수 있다.
    • 또한 Level Streaming과 같은 기능을 활용해 필요할 때 특정 Level이나 Asset을 Load하도록 설정할 수 있다.

'UE5 > Architecture' 카테고리의 다른 글

[Architecture] String  (0) 2024.05.06
[Architecture] Asset Registry  (1) 2024.05.06
[Architecture] Asset Reference  (0) 2024.05.06
[Architecture] DataAsset과 Asset Manager  (0) 2024.05.03
[Architecture] Async Asset Loading  (0) 2024.05.03

+ Recent posts