SlideShare a Scribd company logo
AssetBundle (もどき)

の作り方
∼ AssetBundle がイケてないから、
車輪の再発明をしてやったぜ!っておはなし ∼
2015.09.25 (Fri) / Unity 勉強会 #34
株式会社キッズスター
システムデベロプメントチーム リーダー
森 哲哉
こんばんは!
"自己紹介が

スライドの

半分を占める"
でお馴染みの
もんりぃです!
今日は
AssetBundle
の、機能そのものを
作ってみた。
という おはなしです。
おしながき
おしながき
• AssetBundle のおさらい
• AssetBundle (もどき) を作ってみた
• おまけ
さて、本題
の、前に
自己紹介
whoami
• 森 哲哉 と申します
• a.k.a: もんりぃ / T: @monry / F: monry84
• 明日31歳 / ♂ / O型 / 天 座 / 既婚
• 趣味は「お酒」と「合唱」です
whoami
• 大学を (自主的に) 卒業後、ベンチャーを転々
• Web のフロントエンド、サーバサイドが得意
• Unity 歴 2 年くらい
• インフラ (AWS) も、ちょいちょいやってます
• Cocos2d-JS も触ってます
jobs
• 株式会社キッズスター って会社で働いてます
• 未就学児∼小学生のお子さまをお持ちの

ファミリーをターゲットにした、知育/教育に

関わるアプリ・サービスを展開しております
• 「IID 世田谷ものづくり学校」という、

元中学校に入居しております
office
office
apps
なりきり!!
ごっこランド
パズル&テイルズ

おかしのくにを
つくるのじゃ!!
なりきり!!
アイスクリーム
屋さんごっこ
なりきり!!
ママごっこ
お弁当をつくろう!
おかしの家を
つくろう!
ハンバーガー
やさんごっこ
飛行機を
組み立てよう!
i18n i18n i18n
i18n
ゆかいな
お花屋さん
App Store / Google Play
カテゴリランキング1位
多数獲得!!!
きかんしゃ
トーマスと
パズルで
あそぼう!
キョロちゃん
大冒険
events
events
今度こそ、本題
AssetBundle
の おさらい
AssetBundle って?
• Unity 公式
• DLC のための仕組み
• Unity 5 からは Standard 版でも使える
• (基本的には) どんな Asset も AB 化できる
AssetBundle って?
• AB 準備の流れ
• AB 名設定
• スクリプトから一括構築
• サーバにデプロイ
AssetBundle って?
• AB 利用の流れ
• サーバから取得
• 端末ストレージにキャッシュ
• メモリに展開
• インスタンス化
AssetBundle って?
• イケてるところ
• 簡単に構築できる
• よしなにキャッシュしてくれる
• 複数ファイルを纏められる
• Unity による Asset 最適化が効く
AssetBundle って?
• イケてるところ
• 簡単に構築できる
• よしなにキャッシュしてくれる
• 複数ファイルを纏められる
• Unity による Asset 最適化が効く
AssetBundle って?
Inspector 下部のフォームで名前付けて…
AssetBundle って?
Editor Script を実行するだけ!
using UnityEngine;

using UnityEditor;



public class AssetBundleExporter {



[MenuItem("Custom/Export AssetBundle", false, 1)]

public static void Export() {

string exportPath = "path/to/export";

if (!System.IO.Directory.Exists(exportPath)) {

System.IO.Directory.CreateDirectory(exportPath);

}

var buildAssetBundleOptions = BuildAssetBundleOptions.IgnoreTypeTreeChanges;

BuildPipeline.BuildAssetBundles(

exportPath,

buildAssetBundleOptions,

EditorUserBuildSettings.activeBuildTarget

);

}



}
AssetBundle って?
• イケてるところ
• 簡単に構築できる
• よしなにキャッシュしてくれる
• 複数ファイルを纏められる
• Unity による Asset 最適化が効く
AssetBundle って?
WWW クラスに専用のメソッドがある
WWW.LoadFromCacheOrDownload(url, assetBundleVersion)
AssetBundle って?
• イケてるところ
• 簡単に構築できる
• よしなにキャッシュしてくれる
• 複数ファイルを纏められる
• Unity による Asset 最適化が効く
AssetBundle って?
AB 名を付ける際に同じ名前にすればOK
AssetBundle って?
• イケてるところ
• 簡単に構築できる
• よしなにキャッシュしてくれる
• 複数ファイルを纏められる
• Unity による Asset 最適化が効く
AssetBundle って?
Import Assets (↓) の変換結果がちゃんと効く
AssetBundle って?
• イケてないところ (本題)
• キャッシュを柔軟に管理できない
• 標準では暗号化してくれない
• Content-Type 縛り
• 取得・展開の流れが煩雑
AssetBundle って?
• イケてないところ (本題)
• キャッシュを柔軟に管理できない
• 標準では暗号化してくれない
• Content-Type 縛り
• 取得・展開の流れが煩雑
AssetBundle って?
• Caching.CleanCache() で一括削除できる
• 以上!
• 個別削除はできません!!
• ダミーの CRC 食わせて云々という手もダメでした
AssetBundle って?
Why? Japanese peaple!?
AssetBundle って?
• 基本的にアプリサイズは増え続けます
• 1アプリで2GB越えも夢じゃないっ!
• 上位 ver. で上書きするわけじゃないっぽい
• 一括削除ボタン設置して、ユーザの意志で消させ
る?キャッシュ上限設定して頑張る?有効期限で
工夫する?
AssetBundle って?
自分で頑張りましょう。
AssetBundle って?
• イケてないところ (本題)
• キャッシュを柔軟に管理できない
• 標準では暗号化してくれない
• Content-Type 縛り
• 取得・展開の流れが煩雑
AssetBundle って?
Unity Manual にやり方載ってるよ!
AssetBundle って?
自分で頑張りましょう。
AssetBundle って?
• イケてないところ (本題)
• キャッシュを柔軟に管理できない
• 標準では暗号化してくれない
• Content-Type 縛り
• 取得・展開の流れが煩雑
AssetBundle って?
• Content-Type: application/vnd.unity

じゃないとダウンロードできない
• Unity 5 系では直ってるかも?
• せめて application/octet-stream あたりは

許容していただきたい…
AssetBundle って?
自分で頑張りましょう。
AssetBundle って?
• イケてないところ (本題)
• キャッシュを柔軟に管理できない
• 標準では暗号化してくれない
• Content-Type 縛り
• 取得・展開の流れが煩雑
AssetBundle って?
• WWW.LoadFromCacheOrDownload() が

用意されている
• 「用意はしたが、そのまま使えるとは

言っていない。」
• タイムアウト処理は?並列ダウンロードは?DL
後の後始末は?メモリ展開したモノってどーすりゃ
いいの?
AssetBundle って?
自分で頑張りましょう。
………。
実際に、作ってみた。
作ってみた
• 機能要件は以下の通り
• 圧縮・解凍
• 暗号化・複合化
• 簡素な取得・展開
• キャッシュ個別削除
• 変換された Asset を利用
作ってみた
• 機能要件は以下の通り
• 圧縮・解凍
• 暗号化・複合化
• 簡素な取得・展開
• キャッシュ個別削除
• 変換された Asset を利用
作ってみた
• iOS/Android 実機だと DeflateStream が

使えない問題
• → DotNetZip 使いましょう。
• オプションとして無圧縮を選べるとオシャレ
• 現時点では複数 Asset を纏めるのは未対応
作ってみた
• 機能要件は以下の通り
• 圧縮・解凍
• 暗号化・複合化
• 簡素な取得・展開
• キャッシュ個別削除
• 変換された Asset を利用
作ってみた
• AES とかでよしなに
• やり方はググりましょう。
• の管理は検討課題
• 複合はそれなりに CPU コスト掛かる
• これもオプションで選べると Good
作ってみた
• 機能要件は以下の通り
• 圧縮・解凍
• 暗号化・複合化
• 簡素な取得・展開
• キャッシュ個別削除
• 変換された Asset を利用
作ってみた
• Load() メソッド的なモノに delegate 渡せるよ
うにするとか、コールバックメソッドに
SendMessage するとか、やり方は色々ある
• この辺は、会社毎・プロジェクト毎に柔軟に書
いちゃえば良いんじゃないかと
作ってみた
• 機能要件は以下の通り
• 圧縮・解凍
• 暗号化・複合化
• 簡素な取得・展開
• キャッシュ個別削除
• 変換された Asset を利用
作ってみた
• メイン機能w
• 何気に難しい
• 存在するABの一覧とDL済のABの一覧を

別々に管理する必要がある
• バージョニング対応なんかも
作ってみた
• 機能要件は以下の通り
• 圧縮・解凍
• 暗号化・複合化
• 簡素な取得・展開
• キャッシュ個別削除
• 変換された Asset を利用
作ってみた
• ここも何気に難しい
• 各プラットフォーム毎に Import Assets に

よって変換された Asset から生データを

取得する必要がある
• Asset 毎に取得の仕方が異なる
• 復元するために必要となる付加情報も管理する
作ってみた
• Texture の場合
• Texture2D.GetRawTextureData() を使う
• width/height の他に圧縮フォーマットも

付加情報として持っておくと吉
作ってみた
• AudioClip の場合
• AudioClip.GetData() を使う
• length, frequency, channels あたりを

付加情報に持つ感じ
• 注意点としては AudioClip の LoadType が

Decompress on Load じゃないと

GetData() の結果が空になる
作ってみた
• 他の Asset の場合
• やったことないから分からんw
• けど、何らかの方法で取得できるかと。
まとめ
まとめ
• 「個別削除」というシンプルな機能を

実現するために支払う犠牲は決して安くない。
• AssetBundle が持つ機能を 100% 再現

させるのは現時点では難しい。

(AudioClip 的な意味で)
• 依存性の排除が出来たら AssetStore で

公開するかも。
おまけ
iOS 9 の ATS
• ATS (Application Transport Security) が

iOS 9 SDK でビルドすると有効になる
• 端的に言うと「セキュアじゃないサーバとは通
信させません!」という機能
• AssetBundle のダウンロードもご多分に漏れず
該当し得る
iOS 9 の ATS
• 開発者がやるべきコトは以下の通り
• AB 置き場のサーバを https 対応する
• その際 TLS 1.2 にしたり暗号化アルゴリズム
を堅めにしたりする必要あり
• AB のダウンロード URL を https にする
iOS 9 の ATS
• http → https の URL 自動置換が働くなんて も

あったけど、あれ、嘘です。
• iOS 9 SDK (Xcode 7) でビルドしない限り該当は

しないけど、早めに対応しとくのが吉。
• 置き場が CloudFront の場合、 暗号化アルゴリズムが

弱めな証明書使っているので、独自証明書にするか、

別の場所に置くかしないと NG。
• →年内には解消するそうです。
Thank you for

your attention !!
Any Questions ?

More Related Content

PDF
20150216 Unity Hands-on 「できる!Unity 2D」
PPT
AssetBundle と TextureCompression のおはなし
PDF
(Unityよくわかってない人のための)なんとなくわかるかもしれないAssetBundle
PDF
Unity 5.3 の In-App Purchase を試してみた
PPTX
次世代エンタープライズの開発環境をライブで読み解く
PDF
僕らがWebサービスをつくる5つの理由
PDF
「Webサービスのつくり方」 のつくり方
PDF
2015/06/27 sakuraclub LT @nullpopopo
20150216 Unity Hands-on 「できる!Unity 2D」
AssetBundle と TextureCompression のおはなし
(Unityよくわかってない人のための)なんとなくわかるかもしれないAssetBundle
Unity 5.3 の In-App Purchase を試してみた
次世代エンタープライズの開発環境をライブで読み解く
僕らがWebサービスをつくる5つの理由
「Webサービスのつくり方」 のつくり方
2015/06/27 sakuraclub LT @nullpopopo

What's hot (20)

PPTX
2時間で学ぶjQuery
PDF
Jetpackをざっくり紹介
PPTX
20140523 jQuery基礎 (HTML5ビギナーズ)
PDF
Scc2014 :jQueryの仕組みを完璧に理解する
PPTX
My First Monitoring With Mackerel
PDF
クラスメソッド会社説明会 in 北海道札幌 at smokeymonkey #cmdevio
PPTX
マルチデバイス時代の高速化
PDF
WordPressの構造を理解しよう
PPTX
IoT Hub と Azure Funxtions とかで片桐ヒマボタンを作った話
PDF
JAWS-UG初心者支部第4回 Simple Front 53
PDF
クラスメソッド会社説明会in札幌 — メンバー紹介 #cmdevio
PPTX
現場で使える効果的なHTML&CSS構造設計(Effective HTML&CSS)
PDF
Webデザインの幅を広げる、jQuery【コードを記述する】 先生:保坂 庸介
PDF
JekyllとBootstrapを使って静的なブログを作ってみたよ
PDF
スマホ版ログレスでグローバル展開を想定したサーバ構築をAnsibleで試してみた話
PDF
Webサービスのコンテンツパターン 或いはデータの活⽤
PPTX
スマホ版ログレスにポストエフェクトシステムを導入した話
PDF
jQueryで作るカスタム投稿の画像スライダーライブラリ
PPTX
メンテナブルなJsってなんだろう
PDF
Vuejs meetup
2時間で学ぶjQuery
Jetpackをざっくり紹介
20140523 jQuery基礎 (HTML5ビギナーズ)
Scc2014 :jQueryの仕組みを完璧に理解する
My First Monitoring With Mackerel
クラスメソッド会社説明会 in 北海道札幌 at smokeymonkey #cmdevio
マルチデバイス時代の高速化
WordPressの構造を理解しよう
IoT Hub と Azure Funxtions とかで片桐ヒマボタンを作った話
JAWS-UG初心者支部第4回 Simple Front 53
クラスメソッド会社説明会in札幌 — メンバー紹介 #cmdevio
現場で使える効果的なHTML&CSS構造設計(Effective HTML&CSS)
Webデザインの幅を広げる、jQuery【コードを記述する】 先生:保坂 庸介
JekyllとBootstrapを使って静的なブログを作ってみたよ
スマホ版ログレスでグローバル展開を想定したサーバ構築をAnsibleで試してみた話
Webサービスのコンテンツパターン 或いはデータの活⽤
スマホ版ログレスにポストエフェクトシステムを導入した話
jQueryで作るカスタム投稿の画像スライダーライブラリ
メンテナブルなJsってなんだろう
Vuejs meetup
Ad

Viewers also liked (17)

PDF
Unity での asset bundle による追加コンテンツの扱い方
PDF
UNITY5の地味だけど現場で 役に立つ新機能紹介 & 拡充されるクラウドサービス
PDF
超便利! Unity Cloud Build の使い方
PDF
Unityのasset bundle運用実例@lordofknights
PPTX
UnityでもTaskが使いたい!~MinimumAsyncBridgeの紹介~
PDF
【Unite 2017 Tokyo】バグを殲滅!Unityにおける実践テスト手法
PDF
【Unite 2017 Tokyo】中国でAndroidアプリを出す!Xiaomiストアでのアプリリリース、収益化のためにできること
PDF
【Unite 2017 Tokyo】いかにして個人制作ゲームで生きていくか〜スマホゲームレッドオーシャンの泳ぎ方〜
PDF
【Unite 2017 Tokyo】新アセットバンドルツール詳解:アセット設定とアセットバンドルのワークフローを簡単に
PDF
【Unite 2017 Tokyo】Unity UI最適化ガイド 〜ベストプラクティスと新機能
PDF
【Unite 2017 Tokyo】もっと気軽に、動的なコンテンツ配信を ~アセットバンドルの未来と開発ロードマップ
PDF
【Unite 2017 Tokyo】セルシェーダーを使用した3Dキャラアプリの開発事例
PDF
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
PDF
【Unite 2017 Tokyo】Navmesh完全マスターへの道
PDF
【Unite 2017 Tokyo】Unity最適化講座 ~スペシャリストが教えるメモリとCPU使用率の負担最小化テクニック~
PDF
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
PDF
【Unite 2017 Tokyo】もっと気軽に、動的なコンテンツ配信を ~アセットバンドルの未来と開発ロードマップ
Unity での asset bundle による追加コンテンツの扱い方
UNITY5の地味だけど現場で 役に立つ新機能紹介 & 拡充されるクラウドサービス
超便利! Unity Cloud Build の使い方
Unityのasset bundle運用実例@lordofknights
UnityでもTaskが使いたい!~MinimumAsyncBridgeの紹介~
【Unite 2017 Tokyo】バグを殲滅!Unityにおける実践テスト手法
【Unite 2017 Tokyo】中国でAndroidアプリを出す!Xiaomiストアでのアプリリリース、収益化のためにできること
【Unite 2017 Tokyo】いかにして個人制作ゲームで生きていくか〜スマホゲームレッドオーシャンの泳ぎ方〜
【Unite 2017 Tokyo】新アセットバンドルツール詳解:アセット設定とアセットバンドルのワークフローを簡単に
【Unite 2017 Tokyo】Unity UI最適化ガイド 〜ベストプラクティスと新機能
【Unite 2017 Tokyo】もっと気軽に、動的なコンテンツ配信を ~アセットバンドルの未来と開発ロードマップ
【Unite 2017 Tokyo】セルシェーダーを使用した3Dキャラアプリの開発事例
【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術
【Unite 2017 Tokyo】Navmesh完全マスターへの道
【Unite 2017 Tokyo】Unity最適化講座 ~スペシャリストが教えるメモリとCPU使用率の負担最小化テクニック~
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
【Unite 2017 Tokyo】もっと気軽に、動的なコンテンツ配信を ~アセットバンドルの未来と開発ロードマップ
Ad

Similar to AssetBundle (もどき) の作り方 (9)

PDF
ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~
PDF
Unity 5 の AssetBundle について (浅く) まとめてみた - 2015/05/22 第31回 Unity 勉強会
PDF
Asset bundleなどの、Unity3d基礎知識
PDF
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
PPTX
Deep-Dive into Scriptable Build Pipeline
PPT
実行時のために最適なデータ構造を作成しよう
PDF
【Unite 2018 Tokyo】『CARAVAN STORIES』のアセットバンドル事例
PDF
1日で作るカジュアルゲーム、FlappyXXXXを作ろう
PDF
Unity assetevent
ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~
Unity 5 の AssetBundle について (浅く) まとめてみた - 2015/05/22 第31回 Unity 勉強会
Asset bundleなどの、Unity3d基礎知識
Unity に於ける iOS ビルド自動化のおはなし - 20141030 第26回 Unity 勉強会
Deep-Dive into Scriptable Build Pipeline
実行時のために最適なデータ構造を作成しよう
【Unite 2018 Tokyo】『CARAVAN STORIES』のアセットバンドル事例
1日で作るカジュアルゲーム、FlappyXXXXを作ろう
Unity assetevent

More from Mori Tetsuya (20)

PDF
GraphView のすゝめ / Introduction of GraphView
PDF
基盤・設計まわりでしくじってしまった話
PDF
2020年版 Unity Package Manager 更新点まとめ
PDF
Unity Development Infrastructure / Unity プロジェクトの開発基盤を大公開
PDF
Future of UniFlow
PDF
Clean Architecture for Unity
PDF
Visual Programming Framework for Unity - UniFlow のご紹介
PDF
Unity ユーザのための Git ハンズオン #2
PDF
Unity で Unit な Test を書いてみた
PDF
Unity meets Kinect -Unity で NUI を扱ってみた- / 2015.06.23 at TechBuzz Space
PDF
できる! Unity 2D (vol.2)
PDF
20150123 第28回 Unity 勉強会「Unity に於けるビルド自動化のおはなし & 設定管理とリソース管理のおはなし」
PDF
Unity に於ける Android ビルド自動化のおはなし - 20141215 第27回 Unity 勉強会
PDF
20140926 NCMB勉強会 #4 - Unity meets SpriteStudio
PDF
20140829 第24回 Unity 勉強会 - Unity meets SpriteStudio
PDF
20140822 Swift 勉強会 vol.3 - はぢめての Swift
PDF
Unity に於けるモバイルプラットフォーム向けビルド自動化のおはなし
PDF
20140711 MySQL Casual Talks vol.6 / 続・Amazon RDS Casual Talks
PDF
20140618 教育・知育アプリのつくりかた
PDF
20140530 Unity に於ける Localization のおはなし
GraphView のすゝめ / Introduction of GraphView
基盤・設計まわりでしくじってしまった話
2020年版 Unity Package Manager 更新点まとめ
Unity Development Infrastructure / Unity プロジェクトの開発基盤を大公開
Future of UniFlow
Clean Architecture for Unity
Visual Programming Framework for Unity - UniFlow のご紹介
Unity ユーザのための Git ハンズオン #2
Unity で Unit な Test を書いてみた
Unity meets Kinect -Unity で NUI を扱ってみた- / 2015.06.23 at TechBuzz Space
できる! Unity 2D (vol.2)
20150123 第28回 Unity 勉強会「Unity に於けるビルド自動化のおはなし & 設定管理とリソース管理のおはなし」
Unity に於ける Android ビルド自動化のおはなし - 20141215 第27回 Unity 勉強会
20140926 NCMB勉強会 #4 - Unity meets SpriteStudio
20140829 第24回 Unity 勉強会 - Unity meets SpriteStudio
20140822 Swift 勉強会 vol.3 - はぢめての Swift
Unity に於けるモバイルプラットフォーム向けビルド自動化のおはなし
20140711 MySQL Casual Talks vol.6 / 続・Amazon RDS Casual Talks
20140618 教育・知育アプリのつくりかた
20140530 Unity に於ける Localization のおはなし

AssetBundle (もどき) の作り方