今回は、先日行われた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