BuildCookRun 과정 (코드)
// -------------------- BuildCookRun Command --------------------
ExecuteBuild(); // BuildCookRun.Automation.cs
DoBuildCookRun(); // BuildCookRun.Automation.cs
// -------------------- Build --------------------
Build(); // BuildProjectCommand.Automation.cs
Build(); // UE4Build.cs
BuildWithUBT(); // UE4Build.cs
RunUBT(); // UBTUtils.cs
Run(); // ProcessUtils.cs
// -------------------- Cook --------------------
Cook(); // CookCommand.Automation.cs
CookCommandlet(); // CommandletUtils.cs
Main(); // CookCommandlet.cpp
CookByTheBook(); // CookCommandlet.cpp
// -------------------- Stage --------------------
CopyBuildToStagingDirectory(); // CopyBuildToStagingDirectory.Automation.cs
ApplyStagingManifest() // CopyBuildToStagingDirectory.Automation.cs
CreatePakUsingStagingManifest() // CopyBuildToStagingDirectory.Automation.cs
CreatePaksUsingChunkManifests() // CopyBuildToStagingDirectory.Automation.cs
CreatePaks() // CopyBuildToStagingDirectory.Automation.cs
RunUnrealPakInParallel() // CopyBuildToStagingDirectory.Automation.cs
ExecuteUnrealPak() // PakFileUtilities.cpp
// -------------------- Package --------------------
Package(); // PackageCommand.Automation.cs
Package(); // [PlatformName]Platform.Automation.cs
// -------------------- Archive --------------------
Archive(); // ArchiveCommand.Automation.cs
CreateDeploymentContext(); // CopyBuildToStagingDirectory.Automation.cs
ApplyArchiveManifest(); // ArchiveCommand.Automation.cs
ProcessArchivedProject(); // [PlatformName]Platform.Automation.cs
// -------------------- Deploy --------------------
Deploy(); // DeployCommand.Automation.cs
CreateDeploymentContext(); // CopyBuildToStagingDirectory.Automation.cs
PushDir(); // CopyBuildToStagingDirectory.Automation.cs
Run(); // ProcessUtils.cs
// -------------------- Run --------------------
Run(); // RunProjectCommand.Automation.cs
RunInternal(); // RunProjectCommand.Automation.cs
Perforce 관련
p4 -p ${P4_PORT} -u ${P4_USER} -P ${P4_PASSWORD} -c ${P4_CLIENT} -u ${P4_USER}
p4 뒤에 -p ~ -u 붙이는 이유는 해당 Perforce 서버 컴퓨터에서 P4 명령을 실행하기 위해 붙입니다
만약 붙이지 않으면 로컬에서 실행됩니다.
ex)
p4 -p ${P4_PORT} -u ${P4_USER} -P ${P4_PASSWORD} -c ${P4_CLIENT} -u ${P4_USER} | p4 set -s P4CHARSET=utf8
p4 -p ${P4_PORT} -u ${P4_USER} -P ${P4_PASSWORD} -c ${P4_CLIENT} -u ${P4_USER} submit -d "description"
p4 set -s P4CHARSET=utf8
언어 설정 (P4CHARSET = 유니코드 파일의 코드 변환에 사용되는 문자)
이 명령어를 실행하지 않으면 파일 타입이 다르게 올라가거나 한글이 깨질 수 있습니다.
RunUAT 매개변수
https://github.com/botman99/ue4-unreal-automation-tool#What-Happens-When-A-Game-Is-Packaged 모든 인자가 있진 않지만, 해당 깃허브에 자세하게 설명되어 있음
Turnkey -command=VerifySdk -UpdateIfNeeded -platform=%TargetPlatform% -project=%ProjectFullPath%
Turnkey |
언리얼 엔진 5 에 도입된 시스템 으로, SDK 설치 및 개발 키트 플래싱을 위한 소스 파일 찾기를 포함하여 플랫폼 지원 설정에 필요한 대부분의 단계를 자동화합니다. |
-command=Vertify -Platform=%Platform% |
확인하려는 SDK가 있는 플랫폼을 선택하라는 메시지를 표시합니다. 그런 다음 Turnkey는 현재 SDK 설치에 대한 정보를 출력하고 언리얼 엔진이 예상하는 매개변수와 일치하는지 확인합니다. |
해당 프로젝트의 플랫폼에 대한 SDK를 확인하고 필요하면 업데이트를 합니다.
BuildCookRun 과정
https://qiita.com/donbutsu17/items/f798d159049f82a277ee
1. Build - 선택한 플랫폼에 대한 실행 파일 컴파일
- 프로젝트 및 엔진 소스코드를 각 플랫폼에 대해 빌드 / 실행파일(.exe) 생성
- C++은 [Project]/Binaries/[Platform]
- 블루프린트는 Engine/Binaries/[Platform]
2. Cook - 편집기를 실행하여 콘텐츠 변형
- 플랫폼에 최적화된 형태로 내부 데이터를 변환 ex) 안드로이드: RGB → ETC 포맷
3. Stage - 실행 파일과 컨텐츠를 개발 dir 와 별도의 dir인 스테이징 영역에 복사
- Build 시 생성한 실행 파일과 Cook 시 생성한 에셋을 Stage dir에 복사
- 쿠킹된 에셋 세트를 하나의 파일로 묶는 경우 이 단계 에서 .pak 파일로 만듦
(.pak 파일로서 1 파일에 모아 두는 이유로서는, 파일 액세스를 효율적으로 실시할 수 있는 것이나, 애셋을 압축해 절대 크기로 패키지에 포함하는 것 수 있기 때문)
4. Package - 프로젝트를 플랫폼의 기본 배포 형식으로 패키지
- 각 플랫폼에서 실행되는 어플리케이션 패키지를 만드는 단계 ex) 안드로이드 .apk
5. Deploy - 대상 장치에 빌드 배포
6. Run - 대상 플랫폼에서 패키징 된 프로젝트를 시작하는 단계
$ProjectDir/$EngineRunUAT -ScriptsForProject=$ProjectFullPath \
Turnkey -command=VerifySdk -platform=$TargetPlatform -UpdateIfNeeded -project=$ProjectFullPath \
BuildCookRun -nop4 -utf8output -build -cook -stage -package -archive -project=$ProjectFullPath \
-target=$ProjectName -platform=$TargetPlatform -clean -pak -iostore -compressed -ddc=DerivedDataBackendGraph -prereqs \
-archivedirectory=$PackageDir -clientconfig=$BuildConfig -nocompileeditor -skipbuildeditor
-build |
타겟플랫폼 -platform 혹은 -targetplatform 에 대해 실행 파일을 컴파일 (C++ 프로젝트) 반대 옵션은 -nocompile 컴파일 단계를 건너뛰고 이전에 컴파일된 실행 파일을 사용하여 게임을 빌드 |
-nocompileuat -nocompileeditor -skipbuildeditor |
-nocompileuat UAT로 컴파일 하지 않도록 지시?? → 이 옵션을 사용하면 targetplatform 무시하고 그냥 해당 플랫폼 (맥이면 맥) 으로 뽑아버린다. -nocompileeditor 에디터의 컴파일을 수행하지 않도록 지시 / 에디터를 컴파일하지 않고, 이전에 컴파일된 에디터 실행 파일을 사용 -skipbuildeditor 에디터의 빌드를 건너뛰도록 지시 / 빌드 단계 자체를 건너뛰므로 컴파일된 에디터 실행 파일도 사용하지 않음 패키징 된 파일은 에디터 실행파일 자체를 사용하지 않으므로 패키징을 뽑을 때, -nocompileeditor / -skipbuildeditor 옵션을 둘 다 사용해야 함 |
-cook |
패키징을 위해 게임 콘텐츠를 쿠킹하도록 AutomationTool에 지시합니다. 쿠킹은 에디터에서만 필요한 Unreal .uasset 패키지의 데이터를 제거하므로 쿠킹은 애셋을 조금 더 작게 만듭니다. Cooking은 또한 오래된 셰이더가 있는 모든 콘텐츠에 대해 셰이더를 빌드합니다. |
-stage |
실행 파일과 콘텐츠를 개발 디렉터리 외부의 독립형 디렉터리인 스테이징 영역에 복사 ?? |
-package |
타겟플랫폼 -platform 혹은 -targetplatform 에 대해 프로젝트를 패키징 합니다. |
-archive |
이 빌드를 -archivedirectory 디렉토리에 넣습니다. |
-archivedirectory |
빌드를 넣을 디렉토리 경로 ex) -archivedirectory={path} |
-platform 혹은-targetplatform |
빌드할 플랫폼 Win64 / Android / Mac / IOS 등.. join multiple platforms using + ex) -platform = Mac+IOS |
-configuration |
빌드 구성을 나타내며 패키지 빌드에 포함될 게임 실행 파일을 식별![]() join multiple platforms using + ex) -configuration = Debug -target 과 같이 사용하면 ERROR: Cannot mix game and client targets 발생 -target 사용하려면 -configuration 대신 -clientconfig 사용 |
-client -noclient -dedicatedserver |
빌드 타겟 설정 client : 클라이언트와 서버를 빌드, 쿠킹 및 실행하고 클라이언트 대상 구성을 사용 noclient : 클라이언트를 실행하지 않고 서버만 실행 dedicatedserver : 클라이언트와 서버를 모두 빌드, 쿠킹 및 실행 |
-target |
빌드 타겟 설정 인수는 프로젝트 이름(예: MyAwesomeGame) 또는 편집기(예: MyAwesomeGameEditor) 형식으로 프로젝트를 지정하고 그 뒤에 플랫폼(Win32, Win64, Linux, Mac 등), 빌드가 옵니다. 구성(개발, 테스트, 출하 등). "-WaitMutex"는 여러 프로세스가 동시에 동일한 파일에 액세스하는 것을 방지하는 뮤텍스를 생성하기 위해 여러 프로세스를 사용하는 빌드를 처리하기 위해 UBT에서 사용 ![]() ![]() join multiple platforms using + ex) -Target="MoonEditor Win64 Development" 프로젝트 이름 / 플랫폼 / configuration 한번에 쓸 수 있는 듯 |
-map -allmaps |
지정된 맵 목록만 쿠킹 및 스테이징 ex) -map=맵이름1+맵이름2 모든 맵 빌드 allmaps 플래그를 사용하는 경우 유효한 +Map=\Game\Maps\Map.umap 구문이 있는 [AllMaps]를 DefaultEditor.ini에 추가해야 합니다. |
-pak |
패키징 도구에 모든 쿠킹된 콘텐츠를 압축 가능한 Unreal Engine .pak 파일에 넣도록 지시합니다. Pak 파일을 암호화하여 사람들이 게임을 조작하거나 게임에서 자산을 추출하는 것을 더 어렵게 만들 수도 있습니다. 모든 콘텐츠를 .pak 파일에 넣으면 어떤 자산이 패키징되고 어떤 자산이 패키징되지 않는지 확인하기가 훨씬 더 어려워집니다. → 그래픽, 개체, 텍스처, 사운드 및 기타 게임 데이터들을 단일 파일로 "패키징" 할 수 있습니다. PAK 파일은 종종 이름이 바뀐 .ZIP 파일입니다. 에셋들을 '암호화' 할 수 있으므로 보안강화 (암호화 방법은 따로 찾아야 할듯) https://github.com/allcoolthingsatoneplace/UnrealPakTool/blob/master/Readme.md |
-iostore |
I/O Store 컨테이너 파일은 게임의 에셋, 텍스처, 사운드 등의 데이터를 하나의 파일로 묶어서 저장하는 방식입니다. 이렇게 하면 게임 실행 중에 필요한 데이터를 더 효율적으로 로드하고 압축을 풀어서 사용할 수 있습니다. I/O Store는 게임의 크기를 줄이고 로딩 시간을 단축하는 데 도움을 줍니다. pak 이랑 같은 옵션인것 같은데 -pak 은 안정성과 호환성이 검증된 데이터 패키징 형식이고 -iostore 는 최신기능이라 한다. https://docs.unrealengine.com/5.0/ko/zen-loader-in-unreal-engine/ |
-clean |
패키징 프로세스가 시작되기 전에 Intermediate 파일을 삭제하고, 이전의 쿠킹 또는 스테이징(패키지) 파일을 삭제합니다. |