初めてのScriptableBuildPipeline
learning.unity3d.jp
具体的にカスタムビルドパイプラインを作るために必要になる知識と具体的なカスタム例
learning.unity3d.jp
ブラックボックスなAssetBundleのビルドステップをカスタムして、
カスタムしたタスクを差し込んだり不要なステップを無くしたりできます。
スクリプトデバッグが行えるのでカスタムは楽だと思います。
Pipelineは3つのプリセットが用意されていますので、
これを参考にカスタムしていくのが良いでしょう。
- PlayerScriptsOnly
スクリプトのビルドのみを行う
- AssetBundleCompatible
AssetBundleのビルドを行う
- AssetBundleBuiltInShaderExtraction
ビルトインシェーダーの重複を排除したAssetBundleのビルドを行う
ただし現時点ではAssetBundleManifest
を出力してくれません。
元はAdressable Assetのためのものですからね。
環境
Unity:2019.3.1f1
Scriptable Build Pipeline:1.5.6
DefaultBuildTasks
でプリセットのパイプラインを作成し、
パラメーターを渡すだけでサクッと試せます。
1. Pipelineで実行するタスク(IBuildTask)のリストを作成
プリセットでAssetBundleのビルドに必要なタスクのリストを取得できます。
タスクは自由に追加/削除する事ができ順番に実行されます。
var tasks = DefaultBuildTasks.Create(DefaultBuildTasks.Preset.AssetBundleCompatible);
2. タスクに必要なパラメーター(IContextObject)を作成
タスクにはパラメーター(IContextObject
)を必要とするものもあります。
何のIContextObject
が必要かはタスクの実装を見るのが早いでしょう。
public class SwitchToBuildPlatform : IBuildTask
{
[InjectContext(ContextUsage.In)]
IBuildParameters m_Parameters;
}
AssetBundleCompatible
のタスクでは2つだけで良いです。
var buildParams = new BundleBuildParameters(buildTarget, BuildPipeline.GetBuildTargetGroup(buildTarget), Application.streamingAssetsPath);
var bundleBuilds = ContentBuildInterface.GenerateAssetBundleBuilds();
var bundleBuildContent = new BundleBuildContent(bundleBuilds);
3. BuildTasksRunnerにタスクとパラメーターを渡して実行
BuildTasksRunner
にタスクのリストとパラメーターを渡します。
パラメーターはBuildContext
にセットする必要があります。
var buildContext = new BuildContext();
buildContext.SetContextObject(parameters);
buildContext.SetContextObject(bundleBuildContent);
var buildResult = BuildTasksRunner.Run(tasks, buildContext);
まとめ
「読み方さえ分かっていれば中身は結構シンプル」
具体的なカスタム事例はDeep-Dive into Scriptable Build Pipeline
参照です。
とりあえずはスクリプトコンパイルをスキップする所だけ試すでも良いかと。
実際のプロダクションへの導入とPlayerのビルドを試していきたと思います。
using UnityEngine;
using UnityEditor;
using UnityEditor.Build.Content;
using UnityEditor.Build.Pipeline;
using UnityEditor.Build.Pipeline.Interfaces;
public static class BuildScriptablePipelineTest
{
public static void BundlePipeline()
{
var buildTarget = EditorUserBuildSettings.activeBuildTarget;
var tasks = DefaultBuildTasks.Create(DefaultBuildTasks.Preset.AssetBundleCompatible);
var buildParams = new BundleBuildParameters(buildTarget, BuildPipeline.GetBuildTargetGroup(buildTarget), Application.streamingAssetsPath);
var bundleBuilds = ContentBuildInterface.GenerateAssetBundleBuilds();
var bundleBuildContent = new BundleBuildContent(bundleBuilds);
IBundleBuildResults results;
var buildResult = ContentPipeline.BuildAssetBundles(buildParams, bundleBuildContent, out results, tasks);
}
}
資料
Scriptable Build Pipeline / Usage Examples
docs.unity3d.com