マルチプロセスアセットバンドルビルドは、以前のバージョンの Unity と比較して、アセットバンドルのビルド方法を大幅に改善します。この機能 (2023.1 で導入) は、最初は既存のビルドコードと並行して提供され、デフォルトでは無効です。この新しい機能は、BuildPipeline.BuildAssetBundles() でビルドされたアセットバンドルにのみ適用され、Addressables でビルドされたアセットバンドルには適用されません。
この機能により、ビルドパフォーマンスが向上し、アセットバンドルに関する長年の問題が解決されました。導入を容易にするために、出力の互換性が高く、既存の API から利用できます。
新しいメカニズムでは、アセットデータベースを使用して複数の並行インポートを実行し、中間ファイルをキャッシュします。多くの場合、この機能を有効にすると、クリーンビルドはより速くなり、インクリメンタルビルドはより速く、より正確になります。さらに、Accelerator を使用してマシン間でビルドアーティファクトを共有できるため、あるマシンでのビルドで他のマシンでの同様のビルドのスピードを上げることができます。詳細については、並行インポート を参照してください。
マルチプロセスビルドを有効にすると、シェーダーコンパイル作業も専用のビルドステップに移動します。これにより、ビルドの他のステップと比較して、シェーダーのコンパイルにかかる時間がより明確になります。
ユーザーインターフェースで新機能を有効にするには、以下の手順に従います。
この設定は、 EditorBuildSettings.UseParallelAssetBundleBuilding を使用してスクリプトに公開されます。
ビルドコールバックを使用する既存のプロジェクトをマルチプロセスアセットバンドルビルドと連携するように適応させる場合は、ビルドコールバックコードのコード変更が必要になる場合があります。
ビルド中に、シーンファイルがロードされて、出力形式に再保存されます。スクリプトコードは、この間に、例えば IProcessSceneWithReport.OnProcessScene ビルドコールバックを介して実行されます。マルチプロセスアセットバンドルビルドを使用する場合、このスクリプトコードは AssetDatabase ワーカープロセス内のインポートジョブのコンテキストで実行されます。これは、ScriptedImporter の実行方法と同様です。
ロードされたシーンの状態だけで機能するシーンコールバックの場合、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 のトレースでサポートされているファイル形式です。詳細については、Trace Event Format を参照してください。このコンテンツを表示する方法の 1 つは、Google Chrome または別の Chromium ベースのブラウザーの chrome://tracing ツールで開くことです。
BuildPipelineWriteDebugFiles フラグはマルチプロセスアセットバンドルビルドに固有のフラグです。有効にすると、ビルドで Temp/BuildInstructions フォルダーに余分な JSON 形式ファイルが書き込まれます。これらのファイルは、テストとデバッグの目的でのみ役立ち、ビルド自体には不要であり使用されません。Unity にバグレポートを送信する場合、特にプロジェクト全体を提出できない場合に、これらのファイルを提供すると役立ちます。