【Unity】はじめてのScriptable Build Piepline

今回は、先日行われたGotanda.unity #9で話した「はじめてのScriptable Build Pipeline」の解説記事です。
- スライド
- Scriptable Build Pipelineとは?
- Scriptable Build Pipelineの使い所
- 導入
- Scriptable Build Pipelineを理解するためのサンプルコード
- 関連
スライド
www.slideshare.net
Scriptable Build Pipelineとは?
Scriptable Build PipelineはUnityでゲームやAssetBundleをビルドする為のコードを露出したパッケージです。

本来のBuildPipelineは殆どがネイティブコードで動作しており、簡単なオプションの設定等しかできませんでした。
Scriptable Build Pipelineでは殆どのコードが露出しており、どのような設定で構築されるのか確認したり、AssetBundleの構築ルールを独自のルールにカスタマイズするといった事が可能になります。

Scriptable Build Pipelineの使い所
カスタマイズ出来るからといって、全てを最初から定義する必要はないです。
Scriptable Build PipelineはAddressable Asset Systemが利用しています。基本的にはAddressable Asset Systemで利用するアセットを使用しますが、必要になればScriptable Build Pipelineを利用して生成するAssetBundleのカスタマイズを行う形になります。

またLegacy Build Pipeline.csでUnity 5系のAssetBundleを構築出来るので、現状のAssetBundle Nameベースからの移行も、まぁ何とか出来るんじゃないかなと期待しています。
もしくは、完全に自分の考えでアセットを構築するのもアリでしょう。最終的にアセットの依存関係さえ作れれば良いので、自分で作ってJSONに格納して、それをタスクに渡して…というのも可能かもしれません。それはLegacy Build Pipelineをカスタマイズすれば割と何とかなりそうです。
なおLegacy Build Pipeline.csは既存の全てのビルド設定をサポートしていない点に注意です。特にDisableLoadAssetByFileName`とDisableLoadAssetByFileNameWithExtensionは、パフォーマンスの向上が期待出来るとはいえ、コードの変更を強制する形になるかもしれません。
DisableLoadAssetByFileName:強制ONDisableLoadAssetByFileNameWithExtension:強制ONIgnoreTypeTreeChanges:現状未サポートAppendHashToAssetBundleName:現状未サポート、
(簡単に足せるよね!という暴論)StrictMode:サポートせずDryRunBuild:サポートせず(不要)
導入
Scriptable Build Pipelineはソレ単体でも導入できますが、大抵の場合はAddressable Asset Systemと一緒に導入して、必要に応じてカスタマイズという形になると(個人的には)思います。
なので、その2つを導入していきます。
最初にAddressable Asset Systemを導入します。
これは下の記事が分かりやすいです。
導入したら、Scriptable Build Pipelineのコードを編集可能にします。
プロジェクトフォルダ/Library/PackageCacheにScriptable Build Pipelineのパッケージ(com.unity.scriptablebuildpipeline)が格納されているので、これをプロジェクトフォルダ/Packagesフォルダに移動します。

これでデバッグログを出したり、スクリプトデバッガで挙動を追跡したり、色々と可能になります。
バージョンアップしたいと思ったりパッケージの改造が不要と思えばプロジェクトフォルダ/Packagesからプロジェクトフォルダ/Library/PackageCacheに戻せば良いので、かなり手軽です。
なおソースファイルは全て読み取り専用になっています。

Scriptable Build Pipelineを理解するためのサンプルコード

Scriptable Build Pipelineは、ほとんどの箇所でBuildTaskRunner、IBuildTaskそしてIContextObjectを利用したコードで実装されています。なのでSRPのコードを色々と見る前に、APIがどういったものか把握しとくと、コードを読むのが大分楽になります。
IContextObject: データを格納するインターフェース。IBuildTask: ビルドの処理を担当するインターフェース。BuildTaskRunnerのTask一覧に登録した順にRun()が呼ばれる。使用するデータは[InjectContext]でフィールドに自動的に注入される。BuildTaskRunner:ビルドを実行するクラス
下のコードは、文字を登録して、登録した文字を取得し、表示するだけの簡単なコードです。

あとはDefaultBuildTasks.csを見たりLegacyBuildPipeline.csを追っていくと、結構何をやっているのかがわかります。

関連
マニュアル(時々URLが変わる)
Gotanda.Unity #9