5.8K Views
November 28, 18
スライド概要
AssetBundleやゲームをビルドする新機能、Scriptable Build Pipeineの大雑把な概要と、読み方について紹介します。
リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。
Gotanda.unity #9 はじめての Scriptable Build Pipeline Tatsuhiko Yamamura @ Unity
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を ビルドするために使用しているパッケージ Addressable Asset System アドレスでアセットバンドルを管理 Resource Manager アセットをResources/AssetBundleから取得 Scriptable Build Pipeline AssetBundle/Playerをビルド 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を ビルドするために使用しているパッケージ Player用 Editor用 アドレスでアセットを指定 Addressable Asset System 使用する アセットの登録 Resource Manager Scriptable Build Pipeline オブジェクト群と ロケーションの登録
Scriptable Build Pipelineとは? • Addressable Asset SystemでAssetBundleを ビルドするために使用しているパッケージ Player用 Editor用 アドレスでアセットを指定 Addressable Asset System アドレスの解決 使用する アセットの登録 Resource Manager Scriptable Build Pipeline オブジェクト群と ロケーションの登録
Scriptable Build Pipelineとは? • Addressable Asset SystemでAssetBundleを ビルドするために使用しているパッケージ Player用 Editor用 アドレスでアセットを指定 Addressable Asset System アドレスの解決 使用する アセットの登録 Resource Manager Scriptable Build Pipeline オブジェクト群と ロケーションの登録 アセットのロード
以前は何が問題だった?
以前は何が問題だった? • 簡単に完結したステージやアイテムを • 配信することを想定(と思われ) 複雑な依存関係は辛い
以前は何が問題だった? • 簡単に完結したステージやアイテムを • AssetBundle Nameを元にして • • 配信することを想定(と思われ) 複雑な依存関係は辛い 依存関係も簡単に構築 規模がデカくなってくると 複雑なルールのせいでむしろ辛い
以前は何が問題だった? • 簡単に完結したステージやアイテムを • AssetBundle Nameを元にして • • 配信することを想定(と思われ) 複雑な依存関係は辛い 依存関係も簡単に構築 規模がデカくなってくると 複雑なルールのせいでむしろ辛い もっと自由に制御したい
Unity 5系のBuild Pipeline アセット一覧 GUI操作 スクリプトで制御 成果物 AssetBundle
Unity 5系のBuild Pipeline アセット一覧 GUI操作 スクリプトで制御 AssetBundle Nameの指定 AssetBundle 成果物
Unity 5系のBuild Pipeline アセット一覧 GUI操作 スクリプトで制御 AssetBundle Nameの指定 出力先のプラットフォーム指定 AssetBundle 成果物
Unity 5系のBuild Pipeline アセット一覧 GUI操作 スクリプトで制御 AssetBundle Nameの指定 成果物 出力先のプラットフォーム指定 ブラック☆ボックス AssetBundle • アセットの依存関係をまとめたり • AssetBundle同士の依存関係を云々したり • ハッシュ値を作ったり • マニフェスト作ったり • 圧縮したり • なんか色々
Scriptable Build Pipelineはどうなる? アセット一覧 GUI操作 スクリプトで制御 スクリプトのコンパイル 成果物 アセットの収集 依存関係の構築 リソースをまとめる ファイルの圧縮 ハッシュ値の設定 ファイルの保存先 AssetBundle 概ねのフェーズで、 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つ ビルド処理を実行するAPI • BuildTasksRunner • IBuildTask 処理の実装 • IContextObject 処理に使用するデータ
使ってみる 処理の全体
使ってみる データを登録 格納するデータは”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 おわり