2020年5月2日土曜日

Scriptable Build Pipeline と戯れてみる #2

実際に使ってみる

前回はドキュメントを読んだだけなので今回は実際にインストールしてアセットバンドルをビルドしてみる。

インストール

Unity のパッケージマネージャウインドウ
Unity のパッケージマネージャウインドウ
Unity のパッケージマネージャから Scriptable Build Pipeline を選びインストール。
今回は Unity のバージョンは 2020.2.0a7、Scriptable Build Pipeline は 1.7.2 で試してみた。

SBP をてっとりばやく使ってみる

ドキュメントのサンプル にあるように、まずは既存の Unity 5 くらいからあるアセットバンドルをビルドする API、 BuildPipeline.BuildAssetBundles と同じように使える CompatibilityBuildPipeline.BuildAssetBundles を使ってみる。
アセットバンドルをビルドするエディタスクリプトのBuildPipeline.BuildAssetBundlesを呼ぶ箇所
var manifest = BuildPipeline.BuildAssetBundles(BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.iOS);
から以下のように名前空間 UnityEditor.Build.Pipeline にある
CompatibilityBuildPipeline に置きかえるだけ。
var  manifest = CompatibilityBuildPipeline.BuildAssetBundles(outputPath, BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.iOS);
変更したエディタスクリプトを実行すれば、これまでと同じように Unity のインスペクタ上でアセットバンドル名の設定にしたがってアセットバンドルがビルドできる。
ユニティちゃんSDにアセットバンドル名を指定
SDユニティちゃんにアセットバンドル名を指定

互換性

互換性については Upgrade Guideによるとアセットのロードはフルパスで指定する必要がある。
また、AssetBundle Manifest は CompatibilityAssetBundleManifest クラスで置き換えられる。
AssetBundle Variants には現在のところ未対応の模様といったところ。

内部実装

さらに詳しく調査していくためにまず CompatibilityBuildPipeline の実装を見ていく。
CompatibilityBuildPipeline.BuildAssetBundlesAssetBundleBuild[] が渡されない場合、内部でContentBuildInterface.GenerateAssetBundleBuilds を使いビルドするアセットバンドルの一覧を取得し BundleBuildContent を生成し ContentPipeline.BuildAssetBundles を呼びだす事でアセットバンドルのビルドが行なわれる。
ちなみに ContentPipeline.BuildAssetBundlesはビルドタスクのリストが渡されない場合は DefaultBuildTasks.Preset.AssetBundleCompatibleというプリセットのビルドタスクを使用する。

ここまでのまとめ

CompatibilityBuildPipeline を使えば以前のビルド方法と同じようにアセットバンドルをビルドする事は可能(いくつかの変更があるが)だとわかった。
しかし CompatibilityBuildPipeline を使うだけでは SBP のメリットである独自のタスクを実装して使う事はできない。
そのためタスクを実装してビルドパイプラインをコントロールするには ContentPipeline を使う必要があるようだ。

エディタスクリプト全文

参考

Unity Scriptable Build Pipeline

The Scriptable Build Pipeline (SBP) package allows you to control how Unity builds content. The package moves the previously C++-only build pipeline code to a public C# package with a pre-defined build flow for building AssetBundles. The pre-defined AssetBundle build flow reduces build time, improves incremental build processing, and provides greater flexibility than before.