멀티 프로세스 에셋 번들 빌드에서는 이전 버전의 Unity에 비해 에셋 번들 빌드 방식이 크게 개선되었습니다. 2023.1 버전에 도입된 이 기능은 처음에는 기존 빌드 코드와 함께 제공되며, 기본적으로 비활성화되어 있습니다. 새로운 기능은 BuildPipeline.BuildAssetBundles()를 통해 빌드되는 에셋 번들에만 적용되며, 어드레서블을 통해 빌드되는 에셋 번들에는 적용되지 않습니다.
이 기능은 빌드 성능을 개선하며 에셋 번들의 오랜 문제를 해결해 줍니다. 도입을 지원하기 위해 출력에 높은 수준의 호환성을 제공하며, 기존 API를 통해 사용할 수 있습니다.
새로운 메커니즘은 에셋 데이터베이스를 사용하여 여러 병렬 임포트를 수행하고 중간 파일을 캐싱합니다. 이 기능을 활성화하면 대부분의 경우 클린 빌드가 더 빨라지고, 증분 빌드도 훨씬 빠르고 정확해질 수 있습니다. 또한 액셀러레이터를 사용하면 머신 간에 빌드 아티팩트를 공유하여 한 머신의 빌드가 다른 머신에서 유사한 빌드의 속도를 높이도록 할 수 있습니다. 자세한 내용은 병렬 임포트를 참조하십시오.
멀티 프로세스 빌드를 활성화하면 셰이더 컴파일 작업이 전용 빌드 단계로 옮겨지므로, 빌드의 다른 단계와 비교하여 셰이더 컴파일에 소요되는 시간을 더 명확하게 파악할 수 있습니다.
사용자 인터페이스에서 새 기능을 활성화하려면 다음 단계를 따르십시오.
이 설정은 EditorBuildSettings.UseParallelAssetBundleBuilding을 사용한 스크립팅에 노출됩니다.
빌드 콜백을 사용하는 기존 프로젝트를 멀티 프로세스 에셋 번들 빌드에 맞게 조정하는 경우, 빌드 콜백 코드를 변경해야 할 수 있습니다.
빌드 중에 씬 파일이 로드되고 출력 포맷으로 다시 저장됩니다. 이 시간 동안 스크립트 코드가 실행될 수 있는데, 예를 들어 IProcessSceneWithReport.OnProcessScene 빌드 콜백을 통해 실행될 수 있습니다. 멀티 프로세스 에셋 번들 빌드를 사용하는 경우 이 스크립트 코드는 ScriptedImporter가 실행되는 방식과 유사하게 AssetDatabase 워커 프로세스 내 임포트 작업의 컨텍스트에서 실행됩니다.
로드된 씬의 상태에서만 작동하는 씬 콜백의 경우 AssetDatabase 임포터의 일부로 실행해도 문제가 없습니다. 하지만 다음과 같은 일부 상황의 경우 문제가 생길 수 있습니다.
에셋 변경. 빌드 콜백 내에서 외부 에셋을 생성, 삭제 또는 수정해서는 안 됩니다. 이제 에셋을 변경하는 AssetDatabase API에 대한 호출을 방지하는 특정 보호 기능이 있습니다. 이러한 호출이 이루어지면 명확한 오류 메시지와 함께 스크립팅 예외가 발생합니다.
종속성 추적. 일부 컨텍스트에서는 빌드 콜백이 씬 외부의 다른 에셋 콘텐츠를 읽어야 할 수 있습니다. 씬에서 해당 에셋을 명시적으로 참조하는 경우 추가 변경 없이 올바르게 작동합니다. 하지만 그렇지 않은 경우, 종속성을 추적할 수 있도록 빌드 콜백 구현을 업데이트하여 새로운 BuildPipelineContext.DependOnAsset 호출을 사용해야 합니다. 그렇지 않으면 향후 증분 빌드에서 이전의 캐시된 아티팩트를 재사용할 수 있으며 콜백 스크립트가 호출되지 않습니다.
싱글톤 및 전역 상태. 새로운 빌드 시스템의 멀티 프로세스 특성으로 인해, 씬과 기타 에셋이 메인 Unity 프로세스 내에서 순차적으로 로드되지 않고 서로 다른 워커 프로세스에서 로드됩니다. 따라서 싱글톤과 같이 전역 데이터에 대한 공유 액세스를 사용하는 코드가 작동을 멈출 수 있습니다. 씬에 직접 저장되거나 에셋 또는 임시 파일에 저장된 데이터를 사용하기 위해 공유 메모리를 이용하는 코드 작업을 다시 수행해야 할 수도 있습니다.
캐싱으로 인해 증분 빌드는 마지막 빌드 이후 씬이나 다른 종속성이 변경된 경우에만 빌드 콜백을 호출합니다. 스크립트 콜백이 변경되어 다시 실행해야 하는 경우 콜백의 BuildCallbackVersion 속성을 증분하여 실행할 수 있습니다. 해당 속성을 지정하지 않은 콜백의 경우 기본 버전 번호는 1입니다.
참고: 빌드 중에 스크립팅 코드가 호출될 수 있는 다른 상황도 있습니다(예: ExecuteInEditMode 속성이 있는 MonoBehaviour 파생 클래스의 Awake 메서드). AssetDatabase 임포트 중에 허용되지 않는 작업을 수행하는 코드가 있는 경우 해당 코드를 변경해야 할 수 있습니다. 팁: BuildPipeline.isBuildingPlayer API는 에셋 번들 빌드 중에 true를 반환하므로, 이를 사용하여 조건부 로직을 추가할 수 있습니다(예: 빌드 중에 문제가 있는 코드 실행을 방지하지만 플레이 모드를 시작할 때는 여전히 허용하는 경우).
에셋 번들 문제 항목에 언급된 일반적인 기법과 툴 외에도, 에셋 번들 빌드에 대한 자세한 정보를 수집하는 데 도움이 되는 몇 가지 진단 플래그를 Preference 창에서 사용할 수 있습니다. 이 플래그는 고급 사용을 위한 것으로 향후 변경되거나 제거될 수 있습니다.
BuildPipelineBinaryBackwardCompatibilityMode
진단 플래그는 멀티 프로세스 에셋 번들 빌드에만 해당합니다. 이 플래그를 활성화하면 특정 동작이 기존 에셋 번들 빌드 로직의 동작과 좀 더 일치하도록 변경됩니다. 일부 경우에는 이 플래그를 활성화하면 멀티 프로세스 프로젝트 설정이 꺼진 상태에서 수행된 빌드와 정확히 일치하는 바이너리 콘텐츠가 포함된 에셋 번들을 생성할 수 있습니다. 이 플래그는 기본적으로 꺼져 있습니다. 에셋 번들 콘텐츠의 차이점은 대부분 의도적인 개선의 결과이며, 호환성 모드는 향후 제거될 수 있기 때문입니다. 하지만 이 플래그는 에셋 번들 콘텐츠의 이탈을 최소화하는 것이 중요한 기존 프로젝트에서 유용할 수 있습니다.
BuildPipelineTEPCapture
진단 플래그가 활성화되면 BuildPipeline.BuildAssetBundles
를 호출할 경우 ‘트레이스 이벤트’ 포맷의 프로파일러 파일이 생성됩니다. 이 파일을 사용하면 각 AssetDatabase 워커 프로세스에서 수행된 단계를 포함하여 빌드가 수행한 단계를 자세히 볼 수 있습니다.
이 파일은 각 빌드에 대해 덮어써지며 Logs/BuildAssetBundlesTEP.json
경로에서 찾을 수 있습니다. 이 파일 포맷은 Chrome Tracing에서 지원하는 포맷입니다. 자세한 내용은 Trace Event 포맷을 참조하십시오. 콘텐츠를 확인하는 한 가지 방법은 Google Chrome이나 다른 Chromium 기반 브라우저에서 chrome://tracing 툴로 여는 것입니다.
BuildPipelineWriteDebugFiles
플래그는 멀티 프로세스 에셋 번들 빌드에만 해당합니다. 이를 활성화하면 빌드에서 추가 JSON 포맷 파일을 Temp/BuildInstructions
폴더에 씁니다. 이 파일은 테스트 및 디버깅 목적으로만 유용하며, 빌드 자체에는 필요하지 않거나 사용되지 않습니다. Unity에 버그 리포트를 보낼 때, 특히 전체 프로젝트를 제출할 수 없는 경우에는 이러한 파일을 제공하는 것이 유용할 수 있습니다.