https://dev.epicgames.com/documentation/ko-kr/unreal-engine/versioning-of-assets-and-packages-in-unreal-engine

 

언리얼 엔진의 에셋 및 패키지 버전 관리 | 언리얼 엔진 5.4 문서 | Epic Developer Community

언리얼 엔진에서 커스터마이징된 시리얼라이제이션 코드 및 버전 관리를 사용하여 에셋과 패키지에서 오브젝트를 로드하는 방법을 제어합니다.

dev.epicgames.com

  • Unreal Engine에는 Engine과 Engine Code, Data 사이의 호환성을 정의하거나 보증하는
    다양한 Version Control System을 제공한다.
    • 이를 이용하면 호환 불가능한 Code나 Data 감지가 가능한다.
    • 여기에 더불어, Custom Serialization 및 Convert Data를 관리할 수 있다.

Engine Version

  • Unreal Engine에서 가장 수준 높고 사용자 가시성이 뛰어난 Version Control
  • Editor 내 Help 메뉴 -> About Unreal Editor 섹션에서 확인 가능
  • 엔진 버전은 다음과 같이 구성되어 있으며, FEngineVersion/FEngineVersionBase 클래스에서 확인할 수 있다.
    • 더보기
      [MajorVersion].[MinorVersion].[PatchVersion].[ChangeListNumber][BranchName]
      5.0.3.20979098+++UE5+Release-5.0
    • Engine Version을 구성하는 각 Component는 상위 값이 증가하지 않는 한 값이 감소하지 않는다.
      • 달리 말하면, 두 Engine Version의 Component별로 비교하면 어느 Version이 최신인지 파악할 수 있다.
    • Major, Minor, Patch Version이 같은 경우,
      Epic의 Changelist보다 이용자가 생성한 Changelist를 항상 최근 버전으로 간주한다.
    • BranchName은 호환성 검사에 사용하지 않는다.
      • 주로 외부에 표시하는 용도
  • Engine Version이 호환되지 않으면 Engine에서 Asset을 Load 할 수 없다.
    • 최신 Engine Version에서 저장된 Asset은 Contents Browser에 나타나지 않는다.
    • 해당 Asset에 Reference는 null로 취급된다.
      • 이 때 Asset을 저장하면 인지하지 못한 Reference가 오염되기 때문에 저장하지 않는 것이 좋다.
  • Changelist 0이 포함된 Engine Version은 다른 모든 Engine Version과 호환되는 것으로 간주한다.
    • Engineer 입장에서는 Engine 개발이 간편해지는 측면이 있지만, Disk에 저장하는 관점에서는 부적합하다.
    • 대신 Contents Creator는 배포된 Editor의 Binary Build를 사용해야 한다.
      • 그래야 정확한 Engine Version Data를 지닌 Asset으로 작업을 하게 된다.
      • 또한 Asset으로 인한 Data 손실을 방지할 수 있다.

Asset and Package

  • Asset은 저장에 사용한 Editor의 Engine Version 정보가 포함되어 있다.
  • Engine은 Load 시 이 값을 확인하고,
    Code 변경을 통해 Serialize 된 Data에 추가되거나 제거된 Property를 적절히 처리할 수 있다.
  • Serialize를 해제하는 중(ex. Asset을 Load 하는 경우)
    • Field를 제거하는 경우에는 해당 Field가 인식되지 않고 무시된다.
    • Field를 추가하는 경우에는 Data에서는 없어지지만, 기본값을 유지한다.
  • Asset의 Data를 Disk에 저장하기 위해 Serialize 하는 경우
    • 삭제된 Field의 Data는 바로 폐기 된다.
    • 새로 추가된 Field의 Data는 유지되어 다른 Property와 함꼐 Serialize된다.
  • 이 결과 Data 구조는 서서히 변경되며,
    해당 Data 구조의 Serialized Expression은 새 Field를 추가하는 동안 필요 없는 Field는 자연스럽게 폐기가 된다.
  • 따라서 Serialize 된 Data는 Engine Version과 무관하게 동일하거나 그 이상의 Version에서만 인식할 수 있다.
  • 이 규칙을 통해 이전 Engine Version의 Data 손실 Error를 방지할 수 있다.
    • 최근 Version의 Property를 폐기하고 Data를 다시 Disk상에 Serialize 하면서 발생함.

Programming by Engine Version

 

FEngineVersion

Utility functions.

docs.unrealengine.com

  • Unreal Game Sync를 통해 동기화되지 않은 Code-based Engine Build가 있는 경우,
    이 Build의 ChangeList를 0으로 표시하면 Version Check와 관련해 훨씬 유연한 환경을 만들 수 있다.
  • 하지만 Cooking 과정에서는 해당 Asset에서 Warning이 발생하므로 사용을 지양하는 것이 좋다.
    • 만약 이 Warning을 비활성화 하려면,
      DefaultEngine.in 파일의 [Core.System] Section에 ZeroEngineVersionWarning=0을 추가하면 된다.

Engine Version Update

  • Build의 Engine Version은 Engine 내 /Build/Build.version 파일에서 정의한 값으로 제어할 수 있다.
  • 이 파일을 직접 수정한 뒤, 다음 2가지 방법으로 Version을 Update 할 수 있다.
    • UpdateLocalVersion Commandlet 실행
    • UGC(Unreal Game Sync)로 Sychronize
  • 더보기
    {
    	"MajorVersion": 4,
    	"MinorVersion": 26,
    	"PatchVersion": 2,
    	"Changelist": 0,
    	"CompatibleChangelist": 14830424,
    	"IsLicenseeVersion": 0,
    	"IsPromotedBuild": 0,
    	"BranchName": "++UE4+Release-4.26"
    }
    • Changelist
      • 수동으로 정의
      • 수동으로 업데이트 하거나, UpdateLocalVersion Commandlet으로 Update
      • Update 시 디포 Directory Name을 사용하고 /를 +로 교체
    • CompatibleChangelist
      • 해당 Engine Version과 호환 가능한 것으로 간주할 수 있는 가장 낮은 Changelist
        • 가장 처음 만들어진 Changelist
      • Engine의 Local Build에서처럼 0으로 설정할 때도 있다.
        • 하지만 정식 출시된 Epic의 Build나 내부적으로 배포된 Build가 0이 아니므로
          Local Version과 호환되지는 않는다.
    • IsLicenseeVersion
      • Source Control에서 Synchronize 된 Local Build에 사용할 경우 0으로 지정
      • UpdateLocalVersion Commandlet을 통해 System Build를 할 경우 1
      • Promoted Build에서 사용할 때에는 1이 더 적절하다.
      • Version Check가 더 까다로워지는 대신 Hot Reload가 비활성화 된다.
    • IsPromotedBuild
      • 해당 Build가 Promoted Build인지 여부
      • 기본 값은 1
    • BuildId
      • 위 예시에는 없지만 제공되는 정보
      • Compile 할 때 Engine 및 Module에 전부 이 값을 Tag 한다.
        • Engine에서는 이 값이 없는 모든 Module은 호환 불가능한 대상으로 간주
      • 보통은 공백으로 두는 편이 좋다.
        • 공백으로 둘 경우 Compile 할 때마다 고유한 새 값이 생성된다.

UpdateLocalVersion Commandlet

  • 전용 Build Machine에서 Compile할 때처럼 Build/Build/version 파일을 수동으로 편집 할 필요가 없는 경우에 유용
  • 더보기
    RunUAT.bat UpdateLocalVersion [-CL=INT] [-CompatibleCL=INT] [-Build=STRING] [-SkipHeader] [-Licensee] [-Promoted=BOOL] [-Branch=STRING]
  • CL
    • Build.Version의 Changelist
  • CompatibleCL
    • Build.Version의 CompatibleChangelist
  • Build
    • Source Code의 BUILD_VERSION 매크로를 Update해 Engine의 Build Version String을 변경
  • SkipHeader
    • 이 Parameter가 있으면 Engine의 Header File이 Update 되지 않는다.
  • License
    • Build.version의 IsLicense
    • 이 Parameter가 있는 경우 true로 취급
  • Promoted
    • Build.version의 IsPromotedBuild
    • 0 이외의 정수를 입력하면 true로 간주하고 Field에 1이 입력
  • Branch
    • Build.Version의 BranchName

Object Version

  • UObject 파생 Class는 Engine Version 외에 Object Version Control System을 별개로 운영한다.
    • Engine Level Version
    • Object Level Version
  • Object Serialization은 다음의 용도로 사용된다.
    • 대량의 Burk Data를 포함한 Asset Performance Optimize
    • 단위 변환 시 Data Format 변경을 구현
    • Object Data를 압축된 Format의 Disk에 저장할 때 공간 절약을 위한 Customize
  • Custom Serialization을 위해서는 다음 2가지 작업이 필요하다.
    • UObject::Serialize 함수를 Override하여 Project의 필요에 따라 Data Format 변경
    • 신규 Code의 Object Version에 기반한 검사
  • Serialization이 변경 되어도 하위 호환성을 보존하면서, Engine Version과 같은 방식으로 Data 손실을 방지할 수 있다.

Serialization and Version Control of Engine Level

  • Engine Level에서는 EUnrealEngineObjectUE5Version을 사용해 Serializer Function의 Version을 관리한다.
    • Custom Serializer가 변경될 때마다 새 항목이 EUnrealEngineObjectUE5Version에 추가된다.
  • Epic Games가 Public Unreal Engine Launch Version에서 이 Type을 수정하면,
    병렬 Global EnumType인 EUnrealEngineObjectLicenseeUEVersion은 사용자가 자체적으로
    Engine Level Version 관리를 추가할 수 있다.
  • 이후 Package를 저장하면 두 Enum값이 증가한 채로 저장이 된다.
    • Serializer, Deserializer Code는 이 값으로 Data Read/Write 방식을 결정한다.
  • Engine에서는 자동으로 이 Version의 값을 자동으로 자체검사한다.
    • Engine보다 높은 Version이 있는 Package는 Load 할 수 없다.
  • 이 방식은 Engine의 여러 분야를 별개의 팀이 작업하는 곳에서는 적합하지 않다.
    • 다수의 Version에서 Enum Type을 업데이트 할 수 없다.
    • Merge 시 상수를 다시 정렬하는 동안 해당 Version Number로 저장한 Asset이 손상되거나 무효화 된다.
    • 이 경우에는 Engine Level이 아닌 Object Level의 Serialization이 더 적절하다.

Serialization and Version Control of Object Level

  • Programmer들이 동시에 각자 다른 Branch로 개발하는 경우,
    Engine이 FGuid 기반 Custom Version을 통해 Object Level Version Control을 제공해야 한다.
  • FGuid 구조에는 다른 Version과 같이 증가하는 정수형 Version Number 뿐 아니라,
    팀의 요구에 따라 동시에 다양한 Custom Version을 보유할 수 있는 GUID(Global Unique Identifier)도 제공한다.
  • System이나 Branch별로 Custom Version을 유지하면 다른 Branch의 Code와 병합할 때 Conflict가 발생하지 않는다.
  • 더보기
    const FGuid FAnimationCustomVersion::GUID(0x2EB5FDBD, 0x01AC4D10, 0x8136F38F, 0x3393A5DA); 
    
    // 코어로 커스텀 버전 등록 
    FCustomVersionRegistration GRegisterAnimationCustomVersion(FAnimationCustomVersion::GUID, FAnimationCustomVersion::LatestVersion, TEXT("AnimGraphVer"));
 

FArchive

Base class for archives that can be used for loading, saving, and garbage collecting in a byte order neutral way.

docs.unrealengine.com

  • Custom Code에서는 등록된 FGuid에 있는 Version Number를 고려해 Data의 Read/Write 방식을 결정한다.
  • 이런 식으로 등록된 FGuid와 연결된 Version Number는 절대 감소하지 않는다.
    • 이를 통해 Engine은 신규 Version의 Asset을 Load하지 않도록 할 수 있다.

Custom Serialization Function

  • Object는 Serialize를 override 하여 Disk에 있는 정밀 Data 표현을 제어할 수 있다.
    • FArchive를 이용해 Read/Write를 수행하므로 Data Format을 한번만 배치하면 된다.
  • 아래는 FArchive에서 Serialization Code에서의 Version based logic을 작성할 때 유용한 함수들이다.
  • LicenceUEVer에 대한 UEVer 호출을 변경할 경우,
    Epic의 공식 Version Number가 아니라 사용자의 Version Number를 사용하도록 코드가 변경된다.
    • 자체 Version의 Unreal Engine을 따로 관리하는 Epic 외 사용자에게 사용을 권장한다.
  • https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Core/Serialization/FArchiveState?application_version=5.2
 

F Archive State | Unreal Engine 5.4 Documentation | Epic Developer Community

 

dev.epicgames.com

 

F Archive | Unreal Engine 5.4 Documentation | Epic Developer Community

Base class for archives that can be used for loading, saving, and garbage collecting in a byte order neutral way.

dev.epicgames.com

예시

  • PhysXVehicles Plugin의 WheeledVehicle은 Engine Object Version 및 Custom Version을 모두 사용하고,
    실제 코드를 변경하기 전에 만들어진 Asset과도 하위 호환성을 유지한다.
  • 더보기
    void UWheeledVehicleMovementComponent::Serialize(FArchive& Ar)
    {
    	Super::Serialize(Ar);
    	Ar.UsingCustomVersion(FFrameworkObjectVersion::GUID);
    	if (Ar.CustomVer(FFrameworkObjectVersion::GUID) < FFrameworkObjectVersion::WheelOffsetIsFromWheel)
    	{
    		bDeprecatedSpringOffsetMode = true;
    	}
    }
    • 여기서 Custom Version은 WheelSuspension을 표현하는 Physics Spring Object에 대한
      Offset의 계산 방식 변경 변수를 설정할 때 사용된다.
    • 사용된 Version 값은 Physics Code를 관리하는 팀에서 제작한 Enum Type을 가져온다.
  • 더보기
    void FConstraintInstance::PostSerialize(const FArchive& Ar)
    {
    #if WITH_EDITORONLY_DATA
    	// ... 
    	if (Ar.IsLoading() && Ar.UEVer() < VER_UE_FIXUP_MOTOR_UNITS)
    	{
    		AngularVelocityTarget = 1.f / (2.f PI);
    	}
    	// ...
    #endif
    }
    • Angular Velocity가 RPS 대신 RPM으로 발생하는 물리적 변화에 대응해 단위 전화을 수행한다.
    • Angular Velocity는 단위가 없는 부동소수점으로 저장되므로 낮은 Version에서는 Load 중 변환이 필요하다.
      • 이 경우 Asset Load 할 때 Angular Velocity만 수정하면 된다.
    • 이 Type으로 저장되는 모든 Asset은 이미 RPM으로 저장되며,
      다음에 Load 할 때 Code를 변환할 필요가 없도록 현재 Engine Version Number로 저장한다.

Binary Version Control

 

언리얼 엔진의 바이너리 버전 관리 방법 | 언리얼 엔진 5.4 문서 | Epic Developer Community

오래된 DLL 파일로 인해 발생할 수 있는 잠재적인 오류를 완화하는 언리얼 엔진의 빌드 ID 시스템 레퍼런스입니다.

dev.epicgames.com

 

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

[Architecture] Command-line Arguments  (0) 2024.05.07
[Architecture] Config File  (0) 2024.05.06
[Architecture] Task System  (0) 2024.05.06
[Architecture] Programming Subsystem  (0) 2024.05.06
[Architecture] String  (0) 2024.05.06

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/command-line-arguments-in-unreal-engine

 

언리얼 엔진의 명령줄 실행인자 | 언리얼 엔진 5.4 문서 | Epic Developer Community

명령줄 실행인자란 엔진 실행 파일에 전달하여 시작 시 엔진 실행 방식을 커스터마이징할 수 있는 추가 실행인자입니다.

dev.epicgames.com

  • Additional Launch Parameters라고도 불린다.
  • 시작 시 Engine의 실행 방식 Customize 한다.
  • Project를 Test 및 Optimize하기에 유용한 툴
  • 이러한 Setting은 전반적인 조작부터 상세한 옵션까지 그 범위가 다양하다.
    • Unreal Editor가 Full Editor Mode가 아닌 GameMode로 실행 되도록 장제
    • 특정 맵이 게임 내에서 특정 해상도 및 Frame Rate로 실행되도록 선택

Command로 Command-line Argument 전달

  • 더보기
    <EXECUTABLE> [URL_PARAMETERS] [ARGUMENTS]
    • EXECUTABLE
      • 실행파일 이름
    • URL_PARAMETERS
      • URL 파라미터
    • ARGUMENTS
      • Command Flag 또는 Key-Value Pair
  • 더보기
    UnrealEditor.exe MyGame.uproject /Game/Maps/BonusMaps/BonusMap.umap?game=MyGameMode -game -fullscreen

Unreal Editor로 Command-line Argument 전달

  • Unreal Editor는 Command-line Argument로 Standalone Game Customize를 지원한다.
    • Editor에서 Command-line Argument는 Additional Launch Parameter라 불린다.
    • 이 옵션은 Play in Standalone Game 모드에서만 지원된다.
  • 또한 Multiplay Game Test 목적으로 Dedicated Server로만 Command-line Argument를 전달하는 작업도 지원한다.
  • Dedicated Server를 위한 Command-line Argument는 다음과 같다.
    • Server Map Name Override
      • Map Name을 URL Parameter로 전달
    • Additional Server Game Options
      • 추가 URL Parameter 전달
    • Additional Server Launch Parameters
      • URL Parameter 외의 추가 Command-line Flag, Key-Value Pair를 전달
  • Edit -> Editor Preference을 통해 커스터마이즈 가능

Game Launch Parameter

  • Edit -> Editor Preferences -> Level Editor -> Play로 이동해 Play in Standalone Game 이름의 Section 탐색
  • 이 Section의 Additional Launch Parameter를 위한 TextBox에 Command-line Argument를 입력한다.

Server Launch Parameter

  1. Edit -> Editor Preferences -> Level Editor -> Play 로 이동해 Multiplayer Options 이름의 Section 탐색
  2. Launch Separate Server 항목을 활성화하고, Run Under One Process 항목을 비활성화
    • 위 조건을 충족해야 Dedicated Server에 대한 Command-line Argument를 지정할 수 있다.
    • Run Under One Process가 비활성화 된 경우,
      각 Client가 Editor의 개별 Instance를 Spawn하기 때문에 Client의 실행 속도가 느려진다.
  3. Multiplayer Options Section에서 Server로 이동
    • 이 Section에서 3 종류의 Command-line Argument를 지정할 수 있다.
      • Server Map Name Override
      • Additional Server Game Options
      • Additional Server Launch Parameters

Shortcut으로 Command-line Argument 전달

  1. 실행 파일에 대한 Shrotcut 생성
  2. Shortcut을 우클릭하여 Properties 선택
  3. Properties의 Shortcut 이름의 Section에서 Target 이름의 Field  끝에 Command-line Arrgument 추가
  4. 이후 해당 Shortcut을 실행할 경우, 원본 실행 파일로 Command-line Argument가 전달된다.

Custom Command-line Argument 생성

  • Comamnd-line에 원하는 Flag나 Key-Value Pair를 전달하여 자신만의 Argument를 생성할 수 있다.
    • 이를 위해서는 Code 내 Command-line에서 해당 Argument를 읽어야만 한다.
    • Project Code가 Custom Command-line Argument를 읽지 않고 파싱하는 경우,
      해당 Argument는 무시된다.

Flag

  • 더보기
    UnrealEditor.exe MyGame.uproject -game
    • 위 예시에서 -game가 Flag이다.
    • -game은 대상을 Game Mode로 실행하고 싶다는 의미이다.

Flag Parsing

  • 더보기
    UnrealEditor.exe MyGame.uproject -myflag

     

    bool bMyFlag = false;
    if (FParse::Param(FCommandLine::Get(), TEXT("myflag")))
    {
    	bMyFlag = true;
    }

Key-Value Pair

  • 더보기
    UnrealEditor.exe MyGame.uproject -game -windowed -ResX=1080 -ResY=1920
    • Key-Value Pair는 특정 값을 지정하는 Setting Switch이다.
      • Switch에는 현재 상태 뿐 아니라 setting도 동반되어야 한다.

Key-Value Pari Parsing

  • 더보기
    UnrealEditor.exe MyGame.uproject -mykey=42

     

    int32 myKeyValue;
    if (FParse::Value(FCommandLine::Get(), TEXT("mykey="), myKeyValue))
    {
    	// 프로그램이 이 'if' 명령문을 입력하는 경우 mykey가 명령줄에 존재했던 것입니다
    	// myKeyValue는 이제 명령줄을 통해 전달된 값을 포함합니다
    }
  • Engine/Source/Runtime/Core/Public/Misc/CommandLine.h에서
    Command-line과 상호작용 할 수 있는 함수들에 대한 더 자세한 정보를 확인할 수 있다.

Command-line Argument Reference

URL Parameter

  • URL Parameter는 Game이 시작될 때 특정 Map을 로드하도록 강제한다.
  • 비록 선택사항이지만, 제공될 경우에는 실행 파일 이름을 따르거나 존재하는 모든 Flag를 따른다.

Map Name

  • Map Directory 내에 위치한다면 어떤 Map Name이든 표현 가능
  • 선택적으로 .umap 확장자를 포함할 수 있음
  • Map Directory 경로 내에 없는 Map을  다음 두가지 조건을 만족해야 한다.
    • 절대 경로를 사용 혹은 Map Driectory 기준의 상대 경로 사용.
    • Map 뒤에 반드시 .umpa 파일 확장자 요구

Server IP Address

  • Server IP Address를 URL Parameter로 사용해 Game Client를 Dedicated Server에 연결 할 수 있다.

Additional Parameter

  • Map Name 혹은 Server IP Address에 덧붙이는 방식으로 Additional Parameter 지정 가능
  • 각 옵션은 ?로 시작하고 =로 값이 설정된다.
  • 옵션 앞에 -를 붙이면 캐시된 URL Option에서 해당 Option이 제거된다.

Example

  • Map Directory에 위치한 Map으로 게임 열기
  • Map Directory 외부에 위치한 Map으로 게임 열기
    • 더보기
      MyGame.exe /Game/Maps/BonusMaps/BonusMap.umap
  • Map Directory 외부에 위치한 맵으로 Unreal Editor에서 Game 열기
    • 더보기
      UnrealEditor.exe MyGame.uproject /Game/Maps/BonusMaps/BonusMap.umap?game=MyGameMode -game
  • Game Client를 Dedicated Server에 연결
    • 더보기
      UnrealEditor.exe MyGame.uproject /Game/Maps/BonusMaps/BonusMap.umap -server -port=7777 -log
      UnrealEditor.exe MyGame.uproject 127.0.0.1:7777 -game -log

Flag and Key-Value Reference

Read Command-line Argument from File

  • 다음 상황에서 매우 유용함
    • 매우 많은 수의 Command-line Argument를 사용하는 경우
    • 동일한 Argument들을 자주 재사용하는 경우
    • Windows Command line 길이 제한에 걸리는 경우
  • 더보기
    <EXECUTABLE> -CmdLineFile=ABSOLUTE\PATH\TO\FILE.txt

유용한 Command-line Argument

  • Common
  • Rendering 및 GPU
  • CPU 및 Memory
  • Debugging

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

[Architecture] Version Control of Asset and Package  (0) 2024.05.07
[Architecture] Config File  (0) 2024.05.06
[Architecture] Task System  (0) 2024.05.06
[Architecture] Programming Subsystem  (0) 2024.05.06
[Architecture] String  (0) 2024.05.06
  • Unreal Engine의 초기 설정을 제공
  • 간단한 수준에서 Section으로 구분되는 Key-Value를 제공
  • 이 파일을 이용해 Build, Blatform에서 Engine 시작 시 Load되는 Object, Property의 Default 값이 설정된다.
  • 확장자: .ini

구조

  • 더보기
    [SECTION1]
    <KEY1>=<VALUE1>
    <KEY2>=<VALUE2>
     
    [SECTION2]
    <KEY3>=<VALUE3>
    • Key-Value 중 Value는 비워둬도 무방하다.

SectionName

  • 임의의 알파벳 String
  • Config System은 변수가 Code에 존재하는지와 무관하게 모든 Definition을 Load한다.

Module

Plugin

  •  
  • 더보기
    [/Script/PluginName.ClassName]

Blueprint

  • 더보기
    [/PathToUAsset/UAssetName.UAssetName_C]

Custom Section Name

  • 더보기
    [MyConfigSection]
  • Custom Section Name을 사용하면 Section 안에 포함된 Config 변수를 수동으로 Query해야 한다.

Comment

  • 더보기
    [Core.Log]
    ; 다음과 같은 줄을 사용해 DefaultEngine.ini 안에서 로그 카테고리별로 디스플레이 수준을 오버라이드하는 데 이 섹션을 사용할 수 있습니다.
    ; LogTemp=warning

Key-Value Pair

Array

  • Config File의 Array는 여러 Config File에 걸쳐 정보를 통합/축적/오버라이드하는 매커니즘을 제공한다.

Empty

  • 연산자: !
  • Array의 Contents를 비웁니다.
    • = 이후의 모든 값을 무시합니다.

Append

  • 연산자: +
  • Array에 값이 없다면 값을 추가한다.
    • 값이 있다면 아무것도 안 한다.

Remove

  • Array에서 값을 제거합니다.
  • 값이 정확히 매칭되어야 합니다.

Append Duplicate

  • Array에 값이 이미 존재하더라도 값을 배열에 추가합니다.

Array 사용 예시

  • 더보기
    MyConfigArray=7
    !MyConfigArray=ClearArray
    +MyConfigArray=2
    +MyConfigArray=3
    +MyConfigArray=4
    .MyConfigArray=2
    -MyConfigArray=4

Append Duplicate를 사용하는 예시

  • 대표적으로 그래픽 세팅이 있다.
    • Default.ini에서 모든 플랫폼에 제공되는 그래픽 세팅을 추가
    • [Platform].ini에서 각 플랫폼 별 제공하는 별도의 그래픽 세팅 추가
  • 이 경우 게임 실행 시 Default.ini에 기재된 그래픽 세팅이 먼저 로딩 되고,
    [Platform].ini에 기재된 세팅을 로드한다.
  • 이 때, Append Duplicate를 사용하면 [Platform].ini에서의 값이 Default.ini의 값을 오버라이드 하며 않고 확장한다.
  • 그 결과 두 ini 파일에 기재된 값이 동시에 공존하게 된다.

Struct

  • 더보기
    [/Script/MyModule.MyClass]
    MyStruct=(MyStructProperty1=Value1,MyStructProperty2=Value2,...)

String

  • 더보기
    [Internationalization]
    ; 다음은 코어 엔진을 현지화하기 위한 경로이며, 현지화된 게임 콘텐츠 세팅은 *Game.ini 에 있습니다
    +LocalizationPaths=../../../Engine/Content/Localization/Engine
    +CultureDisplayNameSubstitutes="ja;\u53f0\u6e7e;\u30c1\u30e3\u30a4\u30cb\u30fc\u30ba\u30bf\u30a4\u30da\u30a4"
    +CultureDisplayNameSubstitutes="\u53f0\u6e7e;\u4e2d\u534e\u53f0\u5317"
    • 따옴표(", ")는 득수 escape 문자, 16진수, UTF 시퀀스의 사용을 지원한다.
      • 이 점은 현지화/국제화에 유용하다.

Project의 Config File

  • 다음 2가지를 고려하며 작성해야 한다.
    • Unreal Engine이 인식하는 Config File Category는 무엇인지
    • 동일한 Category 내의 파일은 서로 어떻게 상호작용 하는지

Config File Category

Common

  • Engine
  • Game
  • Input
  • DeviceProfiles
  • GameUserSettings
  • Scalability
  • RuntimeOptions
  • InstallBundle
  • Hardware
  • GameplayTags

Editor-Only

  • Editor
  • EditorPerProjectUserSettings
  • EditorSettings
  • EditorKeyBindings
  • EditorLayout

Desktop-Only

  • Compat
  • Lightmass

Config File Layer

  • 각 Category에는 서로 다른 Config File이 있을 수 있다.
  • ex)
    • Engine/Config/BaseGame.ini
    • Engine/Config/Window/WindowsGame.ini
  • 위 두 File은 Game Config File Category에 속한다.
    • 각 File은 추가 Customization Layer를 제공한다.
  • 동일한 Category의 Config File은 Layer에 따라 정리가 된다.
    • 동일한 Category의 File에 중복된 Key-Value Pair가 있는 경우,
      Layer 상 뒤에 오는 파일이 앞에 오는 값을 override한다.
  • Engine Directory에 저장된 Config File은 Engine 배포를 사용하는 모든 Project에 적용된다.
  • <ProjectDirectory>에 위치한 Config File은 해당 Project에만 적용된다.
  • <Platform>에 위치한 Config File은 해당 Platform에만 적용된다.

Category Config File 순서

  1. Engine/Config/Base.ini
  2. Engine/Config/Base<CATEGORY>.ini
  3. Engine/Config/<PLATFORM>/Base<PLATFORM><CATEGORY>.ini
  4. Engine/Platforms/<PLATFORM>/Config/Base<PLATFORM><CATEGORY>.ini
  5. <PROJECT_DIRECTORY>/Config/Default<CATEGORY>.ini
  6. Engine/Config/<PLATFORM>/<PLATFORM><CATEGORY>.ini
  7. Engine/Platforms/<PLATFORM>/Config/<PLATFORM><CATEGORY>.ini
  8. <PROJECT_DIRECTORY>/Config/<PLATFORM>/<PLATFORM><CATEGORY>.ini
  9. <PROJECT_DIRECTORY>/Platforms/<PLATFORM>/Config/<PLATFORM><CATEGORY>.ini
  10. <LOCAL_APP_DATA>/Unreal Engine/Engine/Config/User<CATEGORY>.ini
  11. <MY_DOCUMENTS>/Unreal Engine/Engine/Config/User<CATEGORY>.ini
  12. <PROJECT_DIRECTORY>/Config/User<CATEGORY>.ini
  • 조금 더 자세한 정보는 Engine/Source/Runtime/Core/Public/Misc/ConfigHierarchy.h 파일 참고

Config Layer 예시

  • 더보기

    Engine/Config/BaseEngine.ini

    [/Script/EngineSettings.GameMapsSettings]
    GameDefaultMap=/Engine/Maps/Templates/OpenWorld

     

    MyExampleProject/Config/DefaultEngine.ini

    [/Script/EngineSettings.GameMapsSettings]
    GameDefaultMap=/Game/ThirdPerson/Maps/ThirdPersonMap.ThirdPersonMap
  • 위 경우, Project의 DefaultEngine.ini가 Engine의 BaseEngine.ini보다 뒤에 오기 때문에
    GameDefaultMap의 값은 ThirdPersonMap이 된다.

Code에서 Config 변수 사용

  • Config File의 변수는 UPROPERTY, USTRUCT에 자동으로 적용하거나,
    Config Manager에서 수동으로 값을 읽을 수 있다.

변수에 Config Setting 적용

자동

  • Config File Layer 안에서 자동으로 값을 Load 하도록 Class 설정

Section Format

  • 더보기
    [/Script/ModuleName.ClassName]
    • 여기서 ClassName은 U나 A 접두사를 제외한 클래스 이름이다.

자동으로 Config 변수를 Load

  • 가정
    • MyGameModule 안에 AMyConfigActor 클래스 배치
    • AMyConfigActor 안에 Config File에서 변경하고 싶은 변수 MyConfigVariable이 있다 가정
  1. UClass 선언에서 읽어 올 Config File Category를 설정
  2. Config 할 수 있도록 클래스 내 내 멤버 변수에 Config 마킹
  3. 선택한 Config File Category의 Layer 어디든 변수를 설정한다.
  • 예시
    • 더보기
      UCLASS(config=Game)
      class AMyConfigActor : public UObject
      {
      	GENERATED_BODY()
       
      	UPROPERTY(Config)
      	int32 MyConfigVariable;
      }

       

      [/Script/MyGameModule.MyConfigActor]
      MyConfigVariable=3

수동

Function

  • Engine/Source/Runtime/Core/Public/Misc/ConfigCacheIni.h에서 다음 함수들 제공
    • GetBool
    • GetInt
    • GetInt64
    • GetFloat
    • GetDouble
    • GetString
    • GetText
    • GetArray

Config Category

  • Config Category는 G<Category>Ini로 식변된다.
    • 그 값은 Engine/Source/Runtime/Core/Public/CoreGlobals.h에 있다.

Config Setting 편집

  • 다음 작업을 통해 Config Setting을 변경할 수 있다.
    • 적절한 .ini 파일의 Config 값 수정
    • Unreal Editor 내 Project Settings에 노출된 Config 값 수정
      • 단, 모든 Config Setting이 Project Settings에 노출되지는 않는다.

Code의 Config Setting 저장

  • 더보기
    UCLASS(config=Game)
    class AMyConfigActor : public UObject
    {
    	GENERATED_BODY()
     
    	UPROPERTY(Config)
    	int32 MyConfigVariable;
    }

     

    AMyConfigActor *Settings = GetMutableDefault<AMyConfigActor>();
    Settings->MyConfigVariable = 42;

     

    FString PathToConfigFile;
    Settings->SaveConfig(CPF_Config, *PathToConfigFile);

Config 관련 Console Command

  • 더보기
    GetIni [Platform@]IniFile:Section Key
    • 모든 Config Setting 값을 확인할 수 있다.
    • 심지어 현재 사용중인 Platform 이외의 Platform Setting을 포함한 모든 Config 값을 볼 수 있다.
    • 이 Command는 Load된 Config File만 검색한다.
      • Load 되지 않은 Config File에 있는 Setting에 대한 Query는 실패할 수 있다.

특정 Config File의 Property Override

  • 더보기
    -ini:<CATEGORY>:[SECTION_1]:<KEY_1>=<VALUE_1>,[SECTION_2]:<KEY_2>=<VALUE_2>,...

Category의 Default File

Category 내 모든 파일

접미사가 일치하는 Config File

모든 Config File

Config File에서 Console 변수 설정

  • Config File은 Console 변수를 명시할 수 있는 다른 Machanism을 제공한다.
  • 일부 Console 변수는 일반 Config Category에서 설정될 수 있으며,
    다른 Console 변수는 특정 Config Category에서 설정해야 합니다.
  • 일반적으로 Console 변수는 Project Directory 내 DefaultEngine.ini의 [ConsoleVariables] Section에서 설정된다.

특정 Category

  • 특정 Section에서 설정되어야만 하는 특정 Category의 Console 변수가 있다.

Rendering

  • Serction: /Script/Engine.RendererSettings
  • r.로 시작하는 모든 Console 변수

Rendering Override

  • Section: /Script/Engine/RenderOverrideSettings
  • r.SupportAllShaderPermutations에만 해당

Streaming

  • Section: /Script/Engine.StreamingSettings
  • s.로 시작하는 모든 Console 변수

Garbage Collection

  • Section: /Script/Engine.GarbageColectionSettings
  • gc.로 시작하는 Console 변수

Network Settings

  • Section: /Script/Engine.NetworkSettings
  • n.VerifyPeer, p.EnableMultiplayerWorldOriginRebasing, NetworkEmulationProfiles에만 해당

Cooker Settings

  • Section: /Script/UnrealEd.CookerSettings
  • cook.으로 시작하는 Console 변수

추가 정보를 위한 유용한 Source File

  • 다음 Engine file에서 Config System과 그 Component에 대한 추가 정보를 찾아볼 수 있다.
    • ConfigCacheIni
    • CoreGlobals
    • ConfigHierarchy

 

 

 

 

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

[Architecture] Version Control of Asset and Package  (0) 2024.05.07
[Architecture] Command-line Arguments  (0) 2024.05.07
[Architecture] Task System  (0) 2024.05.06
[Architecture] Programming Subsystem  (0) 2024.05.06
[Architecture] String  (0) 2024.05.06

+ Recent posts