テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】はじめてのScriptable Build Piepline

f:id:tsubaki_t1:20181203181626j:plain

今回は、先日行われたGotanda.unity #9で話した「はじめてのScriptable Build Pipeline」の解説記事です。

スライド

www.slideshare.net

Scriptable Build Pipelineとは?

Scriptable Build PipelineはUnityでゲームやAssetBundleをビルドする為のコードを露出したパッケージです。

f:id:tsubaki_t1:20181203183345j:plain

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

f:id:tsubaki_t1:20181203183724j:plain

Scriptable Build Pipelineの使い所

カスタマイズ出来るからといって、全てを最初から定義する必要はないです。

Scriptable Build PipelineAddressable Asset Systemが利用しています。基本的にはAddressable Asset Systemで利用するアセットを使用しますが、必要になればScriptable Build Pipelineを利用して生成するAssetBundleのカスタマイズを行う形になります。

f:id:tsubaki_t1:20181203182525j:plain

またLegacy Build Pipeline.csUnity 5系のAssetBundleを構築出来るので、現状のAssetBundle Nameベースからの移行も、まぁ何とか出来るんじゃないかなと期待しています。
もしくは、完全に自分の考えでアセットを構築するのもアリでしょう。最終的にアセットの依存関係さえ作れれば良いので、自分で作ってJSONに格納して、それをタスクに渡して…というのも可能かもしれません。それはLegacy Build Pipelineをカスタマイズすれば割と何とかなりそうです。

なおLegacy Build Pipeline.csは既存の全てのビルド設定をサポートしていない点に注意です。特にDisableLoadAssetByFileName`DisableLoadAssetByFileNameWithExtensionは、パフォーマンスの向上が期待出来るとはいえ、コードの変更を強制する形になるかもしれません。

  • DisableLoadAssetByFileName :強制ON
  • DisableLoadAssetByFileNameWithExtension :強制ON
  • IgnoreTypeTreeChanges:現状未サポート
  • AppendHashToAssetBundleName :現状未サポート、
    (簡単に足せるよね!という暴論)
  • StrictMode :サポートせず
  • DryRunBuild :サポートせず(不要)

導入

Scriptable Build Pipelineはソレ単体でも導入できますが、大抵の場合はAddressable Asset Systemと一緒に導入して、必要に応じてカスタマイズという形になると(個人的には)思います。
なので、その2つを導入していきます。

最初にAddressable Asset Systemを導入します。 これは下の記事が分かりやすいです。

kan-kikuchi.hatenablog.com

導入したら、Scriptable Build Pipelineのコードを編集可能にします。

プロジェクトフォルダ/Library/PackageCacheScriptable Build Pipelineのパッケージ(com.unity.scriptablebuildpipeline)が格納されているので、これをプロジェクトフォルダ/Packagesフォルダに移動します。

f:id:tsubaki_t1:20181203200040g:plain

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

なおソースファイルは全て読み取り専用になっています。

f:id:tsubaki_t1:20181203191349j:plain

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

f:id:tsubaki_t1:20181203192728p:plain

Scriptable Build Pipelineは、ほとんどの箇所でBuildTaskRunnerIBuildTaskそしてIContextObjectを利用したコードで実装されています。なのでSRPのコードを色々と見る前に、APIがどういったものか把握しとくと、コードを読むのが大分楽になります

  • IContextObjectデータを格納するインターフェース。
  • IBuildTaskビルドの処理を担当するインターフェース。BuildTaskRunnerのTask一覧に登録した順にRun()が呼ばれる。使用するデータは[InjectContext]でフィールドに自動的に注入される。
  • BuildTaskRunner:ビルドを実行するクラス

下のコードは、文字を登録して、登録した文字を取得し、表示するだけの簡単なコードです。

f:id:tsubaki_t1:20181203195423g:plain

gist.github.com

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

f:id:tsubaki_t1:20181203201308j:plain

関連

マニュアル(時々URLが変わる)

docs.google.com

Gotanda.Unity #9

meetup.unity3d.jp