Scriptable Build Pipeline
Tatsuhiko Yamamura @ Unity
はじめての
Gotanda.unity #9
Scriptable Build Pipelineとは?
• AssetBundleやPlayerをビルドする為のパッケージ
• ビルドするためのコードを、可能な限り露出したもの
Scriptable Build Pipelineとは?
• Addressable Asset SystemでAssetBundleを

ビルドするために使用しているパッケージ
Scriptable Build Pipeline AssetBundle/Playerをビルド
Player用
Editor用
Scriptable Build Pipelineとは?
• Addressable Asset SystemでAssetBundleを

ビルドするために使用しているパッケージ
Scriptable Build Pipeline AssetBundle/Playerをビルド
Addressable Asset System
Resource Manager アセットをResources/AssetBundleから取得
アドレスでアセットバンドルを管理
Player用
Editor用
Scriptable Build Pipelineとは?
• Addressable Asset SystemでAssetBundleを

ビルドするために使用しているパッケージ
Addressable Asset System
Resource Manager
Scriptable Build Pipeline
Player用
Editor用
Scriptable Build Pipelineとは?
• Addressable Asset SystemでAssetBundleを

ビルドするために使用しているパッケージ
Addressable Asset System
Resource Manager
Scriptable Build Pipeline
使用する
アセットの登録
Player用
Editor用
Scriptable Build Pipelineとは?
• Addressable Asset SystemでAssetBundleを

ビルドするために使用しているパッケージ
Addressable Asset System
Resource Manager
Scriptable Build Pipeline
使用する
アセットの登録
オブジェクト群と
ロケーションの登録
Player用
Editor用
Scriptable Build Pipelineとは?
• Addressable Asset SystemでAssetBundleを

ビルドするために使用しているパッケージ
Addressable Asset System
Resource Manager
Scriptable Build Pipeline
使用する
アセットの登録
オブジェクト群と
ロケーションの登録
Player用
Editor用
アドレスでアセットを指定
Scriptable Build Pipelineとは?
• Addressable Asset SystemでAssetBundleを

ビルドするために使用しているパッケージ
Addressable Asset System
Resource Manager
Scriptable Build Pipeline
使用する
アセットの登録
オブジェクト群と
ロケーションの登録
アドレスの解決
Player用
Editor用
アドレスでアセットを指定
Scriptable Build Pipelineとは?
• Addressable Asset SystemでAssetBundleを

ビルドするために使用しているパッケージ
Addressable Asset System
Resource Manager
Scriptable Build Pipeline
使用する
アセットの登録
オブジェクト群と
ロケーションの登録
アドレスの解決
Player用
Editor用
アドレスでアセットを指定
アセットのロード
以前は何が問題だった?
以前は何が問題だった?
• 簡単に完結したステージやアイテムを

配信することを想定(と思われ)
• 複雑な依存関係は辛い
以前は何が問題だった?
• 簡単に完結したステージやアイテムを

配信することを想定(と思われ)
• 複雑な依存関係は辛い
• AssetBundle Nameを元にして

依存関係も簡単に構築
• 規模がデカくなってくると

複雑なルールのせいでむしろ辛い
以前は何が問題だった?
• 簡単に完結したステージやアイテムを

配信することを想定(と思われ)
• 複雑な依存関係は辛い
• AssetBundle Nameを元にして

依存関係も簡単に構築
• 規模がデカくなってくると

複雑なルールのせいでむしろ辛い
もっと自由に制御したい
Unity 5系のBuild Pipeline
アセット一覧
AssetBundle
GUI操作
スクリプトで制御
成果物
Unity 5系のBuild Pipeline
アセット一覧
AssetBundle Nameの指定
AssetBundle
GUI操作
スクリプトで制御
成果物
Unity 5系のBuild Pipeline
アセット一覧
AssetBundle Nameの指定
出力先のプラットフォーム指定
AssetBundle
GUI操作
スクリプトで制御
成果物
Unity 5系のBuild Pipeline
アセット一覧
AssetBundle Nameの指定
出力先のプラットフォーム指定
AssetBundle
ブラック☆ボックス
• アセットの依存関係をまとめたり
• AssetBundle同士の依存関係を云々したり
• ハッシュ値を作ったり
• マニフェスト作ったり
• 圧縮したり
• なんか色々
GUI操作
スクリプトで制御
成果物
Scriptable Build Pipelineはどうなる?
アセット一覧
アセットの収集
依存関係の構築
AssetBundle
スクリプトのコンパイル
GUI操作
スクリプトで制御
成果物
ハッシュ値の設定
リソースをまとめる
ファイルの圧縮
概ねのフェーズで、

C#で定義した

独自の制御が可能に
ファイルの保存先
制御出来ると言っても、実際には…
• 基本的にはAddressable Asset Systemを利用した

挙動を使用する形になると思う
• 必要に応じてカスタマイズする形が、たぶん楽
Addressable Asset System
Resource Manager
Scriptable Build Pipeline
アセットの登録
アセットの登録
アドレスの解決
アドレスでアセットを指定
制御出来ると言っても、実際には…
• 基本的にはAddressable Asset Systemを利用した

挙動を使用する形になると思う
• 必要に応じてカスタマイズする形が、たぶん楽
Addressable Asset System
Resource Manager
Scriptable Build Pipeline
アセットの登録
アセットの登録
アドレスの解決
アドレスでアセットを指定
独自の処理を

設定する事も可能
AssetBundleに違いはない
• 基本的なデータは

.resSとSerializeFileで構築される
• 2018現在、ロードは概ね別スレッドで実現
• SerializeFileはMainかLoadスレッド
• .resSはRenderスレッドでアップロード
使い方〜Addressable Asset Systemを添えて〜
使ってみる
• まずAddressable Asset Systemを導入
使ってみる
• まずAddressable Asset Systemを導入
• manifest.jsonのdependenciesに
com.unity.addressableを追加
使ってみる
• まずAddressable Asset Systemを導入
• manifest.jsonのdependenciesに
com.unity.addressableを追加
• AASはSBPを使用しているので、

勝手に導入されるはず・・・
使ってみる
• Addressable Asset Systemが

導入された!
使ってみる
• Addressable Asset Systemが

導入された!
• しかしScriptableBuildPipelineは

見当たらない
使ってみる
• Addressable Asset Systemが

導入された!
• しかしScriptableBuildPipelineは

見当たらない
• 何処に…?
使ってみる
• Library/PackageCacheに

パッケージが格納されている!
使ってみる
• Library/PackageCacheに

パッケージが格納されている!
• パッケージ参照するパッケージは

PackageManagerに表示されず

キャッシュに格納される。

(たぶん2019.xで修正が入る)
使ってみる
• Library/PackageCacheに

パッケージが格納されている!
• パッケージ参照するパッケージは

PackageManagerに表示されず

キャッシュに格納される。

(たぶん2019.xで修正が入る)
• コレで見れるのはコードのみ

編集するならIDEのサポートを受けたい
使ってみる
• PackageCacheにあるパッケージ

(com.unity.scriptablebuildpipeline)を

Packagesフォルダ以下に移動
使ってみる
• Scriptable Build Pipelineが

追加された!
• Addressable Systemは、

パッケージ内に格納した

Scriptable Build Pipelineを

使用してビルドを行う
• つまりSBPを書き換えれば

AASが生成するAssetBundleに

手を加えられる
脱線
• Packages以下にパッケージを

入れると、”宣言に移動”や

”参照の検索”も楽に出来る
脱線
• Packages以下にパッケージを

入れると、”宣言に移動”や

”参照の検索”も楽に出来る
脱線
• Packages以下にパッケージを

入れると、”宣言に移動”や

”参照の検索”も楽に出来る
• ECSとか実装の確認がしたいなら
Packagesに移動すると便利
脱線
• Packages以下にパッケージを

入れると、”宣言に移動”や

”参照の検索”も楽に出来る
• ECSとか実装の確認がしたいなら
Packagesに移動すると便利
• でもPackagesに含まれるパッケージ
はバージョンアップ出来なくなる。

そこんとこ注意
• Packages以下の

パッケージなら

スクリプトデバッグも

使えた
脱線
• Packages以下の

パッケージなら

スクリプトデバッグも

使えた
脱線
さっき試した
• パッケージの書き換えを行わないなら、

通常通りmanifest.jsonを書き換えるのが良い
脱線
• パッケージの書き換えを行わないなら、

通常通りmanifest.jsonを書き換えるのが良い
脱線
• あとはScriptable Build Pipelineで行う

ビルドの処理を書き換えるだけ…!
使ってみる
Scriptable Build Pipelineの

実装を理解するための、

割と簡単なサンプルコード
使ってみる
使ってみる
使ってみる
重要なAPIは3つ
• BuildTasksRunner
• IBuildTask
• IContextObject
使ってみる
重要なAPIは3つ
• BuildTasksRunner
• IBuildTask
• IContextObject
ビルド処理を実行するAPI
処理の実装
処理に使用するデータ
使ってみる
処理の全体
使ってみる
データを登録
格納するデータは”hoge”の文字
使ってみる
登録するデータの実装
IContexObjectを継承したクラス
処理するデータや、処理結果を格納する
使ってみる
BuildTaskRunnerから

呼び出されるタスクを登録する
タスクは登録した順に呼び出される
使ってみる
タスクの中身
IBuildTaskを継承したクラス
使ってみる
BuildTaskRunnerで

呼び出される処理
今回の場合は、単純にログに表示
使ってみる
事前に登録しておいた

IContexObjectオブジェクトを取得


[InjectContex]属性を設定すると、

インターフェースが一致するオブジェクトが

自動的に格納される
使ってみる
タスクを実行
使ってみる
• メニューを押すと、文字が出る
1. Contextに”Hoge”の文字を登録
2. InjectContextでTaskが

Contexの文字列を取得
3. BuildTasksRunnerで

登録したタスクを実行
使ってみる
• メニューを押すと、文字が出る
1. Contextに”Hoge”の文字を登録
2. InjectContextでTaskが

Contexの文字列を取得
3. BuildTasksRunnerで

登録したタスクを実行
使ってみる
• メニューを押すと、文字が出る
1. Contextに”Hoge”の文字を登録
2. InjectContextでTaskが

Contexの文字列を取得
3. BuildTasksRunnerで

登録したタスクを実行
実際どんな感じに使われてるの?
使ってみる
• よく見ると

Legacy Build Pipelineのコード!
• Unity 5系のAssetBundleを

構築する的なサンプル

(マニフェストも作る)
コンテキストの登録
Legacy Build Pipelineを少し直したもの
ビルド処理の流れ&やってること
Legacy Build Pipelineを少し直したもの
• 読み方さえ分かってれば

中身は結構シンプル
• 読み方さえ分かってれば

中身は結構シンプル
• 処理を追加したければ

タスクに追加すれば良い
• 読み方さえ分かってれば

中身は結構シンプル
• 処理を追加したければ

タスクに追加すれば良い
• ね?(思ったより)簡単でしょ?
Scriptable Build Pipeline
はじめての
おわり
Scriptable Build Pipeline
はじめての

はじめてのScriptable Build Pipeline