Version: 2023.2
언어: 한국어
에셋 번들 다운로드 무결성 및 보안
에셋을 사용한 스크립팅

멀티 프로세스 에셋 번들 빌드(실험 단계)

멀티 프로세스 에셋 번들 빌드에서는 이전 버전의 Unity에 비해 에셋 번들 빌드 방식이 크게 개선되었습니다. 2023.1 버전에 도입된 이 기능은 처음에는 기존 빌드 코드와 함께 제공되며, 기본적으로 비활성화되어 있습니다. 새로운 기능은 BuildPipeline.BuildAssetBundles()를 통해 빌드되는 에셋 번들에만 적용되며, 어드레서블을 통해 빌드되는 에셋 번들에는 적용되지 않습니다.

이 기능은 빌드 성능을 개선하며 에셋 번들의 오랜 문제를 해결해 줍니다. 도입을 지원하기 위해 출력에 높은 수준의 호환성을 제공하며, 기존 API를 통해 사용할 수 있습니다.

새로운 메커니즘은 에셋 데이터베이스를 사용하여 여러 병렬 임포트를 수행하고 중간 파일을 캐싱합니다. 이 기능을 활성화하면 대부분의 경우 클린 빌드가 더 빨라지고, 증분 빌드도 훨씬 빠르고 정확해질 수 있습니다. 또한 액셀러레이터를 사용하면 머신 간에 빌드 아티팩트를 공유하여 한 머신의 빌드가 다른 머신에서 유사한 빌드의 속도를 높이도록 할 수 있습니다. 자세한 내용은 병렬 임포트를 참조하십시오.

멀티 프로세스 빌드를 활성화하면 셰이더 컴파일 작업이 전용 빌드 단계로 옮겨지므로, 빌드의 다른 단계와 비교하여 셰이더 컴파일에 소요되는 시간을 더 명확하게 파악할 수 있습니다.

멀티 프로세스 에셋 번들 빌드 활성화

사용자 인터페이스에서 새 기능을 활성화하려면 다음 단계를 따르십시오.

  1. Edit > Project Settings 를 선택하고 Editor 메뉴를 통해 Editor 설정 창을 엽니다.
  2. Multi-Process AssetBundle Building 체크박스를 클릭합니다.

이 설정은 EditorBuildSettings.UseParallelAssetBundleBuilding을 사용한 스크립팅에 노출됩니다.

차이점 및 알려진 제한 사항

  • 메시 최적화는 멀티 프로세스 에셋 번들 빌드를 사용할 때 활성화되지 않습니다. 빌드 중에는 자동으로 비활성화됩니다. 참고: 실제로 메시 최적화는 빌드 프로세스에 높은 비용과 복잡성을 추가하며, 런타임에 별다른 이득을 주지 못하는 경우가 많습니다.
  • 스프라이트 아틀라스 V1은 지원되지 않습니다. 이 이전 포맷이 감지되면 오류가 출력됩니다. 성공적으로 빌드하려면 V1 에셋을 SpriteAtlasV2로 업데이트해야 합니다.
  • 오브젝트가 서로 영향을 미치는 방식이 이제 각 개별 에셋 번들의 범위 내에서가 아니라 모든 에셋 번들에 걸쳐 계산됩니다. 예를 들어 머티리얼에 특정 셰이더 기능이 활성화되어야 하는 경우, 셰이더가 다른 에셋 번들의 일부이더라도 해당 셰이더 기능이 활성화됩니다. 이렇게 하면 일반적으로 예상에 가까운 결과를 얻을 수 있지만, 특히 셰이더가 여러 에셋 번들에서 반복되는 경우 셰이더 컴파일 시간이 다소 길어질 수 있습니다. 셰이더 키워드도 참조하십시오.
  • 동일한 입력이 주어진 경우 멀티 프로세스 빌드의 출력은 바이너리 면에서 멀티 프로세스가 아닌 빌드와 동일하지 않습니다. 그러나 출력은 기능적으로 동일해야 합니다. 따라서 이미 에셋 번들을 사용자에게 제공한 경우, 멀티 프로세스 빌드를 사용하도록 프로젝트를 업데이트하면 모든 에셋 번들 파일이 변경될 수 있습니다. 이렇게 하면 다음 릴리스를 푸시할 때 라이브 사용자의 다운로드를 트리거할 수 있습니다. 바이너리 차이점은 개선 및 버그 수정으로 인해 발생하며, 이에 따라 에셋 번들 내 오브젝트 명명이나 순서가 약간 달라질 수 있습니다.
  • 프로젝트의 Library 폴더에 사용되는 디스크 공간은 중간 빌드 아티팩트를 캐시하는 데 AssetDatabase를 사용하기 때문에 더 커질 수 있습니다. 이러한 아티팩트는 빌드 시작 시 BuildAssetBundleOptions.ForceRebuildAssetBundle 플래그가 지정되면 완전히 플러시됩니다.
  • 멀티 프로세스가 활성화된 경우 에셋 번들 해시는 에셋 번들의 압축되지 않은 콘텐츠의 해시 값입니다. 이는 압축과 독립적인 파일 버전 식별자 역할을 하며, 에셋 번들 헤더의 콘텐츠를 포함하지 않습니다. 팁: BuildAssetBundleOptions.AssetBundleStripUnityVersion 플래그를 사용하면 에셋 번들 콘텐츠에서 Unity 버전을 제외하여 해시에서도 제외하는 데 유용할 수 있습니다.
  • 이 새로운 해시 계산 방식에서는 전체 빌드를 실행해야만 해시를 확인할 수 있습니다. 따라서 BuildPipeline.BuildAssetBundles가 BuildAssetBundleOptions.DryRunBuild와 함께 호출되면 AssetBundleManifest.GetAssetBundleHash가 0을 반환합니다.

빌드 콜백

빌드 콜백을 사용하는 기존 프로젝트를 멀티 프로세스 에셋 번들 빌드에 맞게 조정하는 경우, 빌드 콜백 코드를 변경해야 할 수 있습니다.

빌드 중에 씬 파일이 로드되고 출력 포맷으로 다시 저장됩니다. 이 시간 동안 스크립트 코드가 실행될 수 있는데, 예를 들어 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에 버그 리포트를 보낼 때, 특히 전체 프로젝트를 제출할 수 없는 경우에는 이러한 파일을 제공하는 것이 유용할 수 있습니다.

에셋 번들 다운로드 무결성 및 보안
에셋을 사용한 스크립팅