assetbundle (もどき) の作り方

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

Upload: mori-tetsuya

Post on 18-Jan-2017

4.953 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: AssetBundle (もどき) の作り方

AssetBundle (もどき)の作り方

~ AssetBundle がイケてないから、 車輪の再発明をしてやったぜ!っておはなし ~

2015.09.25 (Fri) / Unity 勉強会 #34株式会社キッズスター

システムデベロプメントチーム リーダー 森 哲哉

Page 2: AssetBundle (もどき) の作り方

こんばんは!

Page 3: AssetBundle (もどき) の作り方

"自己紹介がスライドの

半分を占める"

Page 4: AssetBundle (もどき) の作り方

でお馴染みの もんりぃです!

Page 5: AssetBundle (もどき) の作り方

今日は

Page 6: AssetBundle (もどき) の作り方

AssetBundle

Page 7: AssetBundle (もどき) の作り方

の、機能そのものを 作ってみた。

Page 8: AssetBundle (もどき) の作り方

という おはなしです。

Page 9: AssetBundle (もどき) の作り方

おしながき

Page 10: AssetBundle (もどき) の作り方

おしながき

• AssetBundle のおさらい

• AssetBundle (もどき) を作ってみた

• おまけ

Page 11: AssetBundle (もどき) の作り方

さて、本題

Page 12: AssetBundle (もどき) の作り方

の、前に

Page 13: AssetBundle (もどき) の作り方

自己紹介

Page 14: AssetBundle (もどき) の作り方

whoami

• “森 哲哉” と申します

• a.k.a: もんりぃ / T: @monry / F: monry84

• 明日31歳 / ♂ / O型 / 天秤座 / 既婚

• 趣味は「お酒」と「合唱」です

Page 15: AssetBundle (もどき) の作り方

whoami• 大学を (自主的に) 卒業後、ベンチャーを転々

• Web のフロントエンド、サーバサイドが得意

• Unity 歴 2 年くらい

• インフラ (AWS) も、ちょいちょいやってます

• Cocos2d-JS も触ってます

Page 16: AssetBundle (もどき) の作り方

jobs• “株式会社キッズスター” って会社で働いてます

• 未就学児~小学生のお子さまをお持ちのファミリーをターゲットにした、知育/教育に関わるアプリ・サービスを展開しております

• 「IID 世田谷ものづくり学校」という、元中学校に入居しております

Page 17: AssetBundle (もどき) の作り方

office

Page 18: AssetBundle (もどき) の作り方

office

Page 19: AssetBundle (もどき) の作り方

apps

なりきり!! ごっこランド

パズル&テイルズおかしのくにを つくるのじゃ!!

なりきり!! アイスクリーム 屋さんごっこ

なりきり!! ママごっこ

お弁当をつくろう!

おかしの家を つくろう!

ハンバーガー やさんごっこ

飛行機を 組み立てよう!

i18n i18n i18n

i18n

ゆかいな お花屋さん

App Sto

re / Goo

gle Play

カテゴリランキング1位

多数獲得!!!きかんしゃ トーマスと

パズルで あそぼう!

キョロちゃん 大冒険

Page 20: AssetBundle (もどき) の作り方

events

Page 21: AssetBundle (もどき) の作り方

events

Page 22: AssetBundle (もどき) の作り方

今度こそ、本題

Page 23: AssetBundle (もどき) の作り方

AssetBundle の おさらい

Page 24: AssetBundle (もどき) の作り方

AssetBundle って?• Unity 公式

• DLC のための仕組み

• Unity 5 からは Standard 版でも使える

• (基本的には) どんな Asset も AB 化できる

Page 25: AssetBundle (もどき) の作り方

AssetBundle って?• AB 準備の流れ

• AB 名設定

• スクリプトから一括構築

• サーバにデプロイ

Page 26: AssetBundle (もどき) の作り方

AssetBundle って?• AB 利用の流れ

• サーバから取得

• 端末ストレージにキャッシュ

• メモリに展開

• インスタンス化

Page 27: AssetBundle (もどき) の作り方

AssetBundle って?• イケてるところ

• 簡単に構築できる

• よしなにキャッシュしてくれる

• 複数ファイルを纏められる

• Unity による Asset 最適化が効く

Page 28: AssetBundle (もどき) の作り方

AssetBundle って?• イケてるところ

• 簡単に構築できる

• よしなにキャッシュしてくれる

• 複数ファイルを纏められる

• Unity による Asset 最適化が効く

Page 29: AssetBundle (もどき) の作り方

AssetBundle って?Inspector 下部のフォームで名前付けて…

Page 30: AssetBundle (もどき) の作り方

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 ); }}

Page 31: AssetBundle (もどき) の作り方

AssetBundle って?• イケてるところ

• 簡単に構築できる

• よしなにキャッシュしてくれる

• 複数ファイルを纏められる

• Unity による Asset 最適化が効く

Page 32: AssetBundle (もどき) の作り方

AssetBundle って?WWW クラスに専用のメソッドがある

WWW.LoadFromCacheOrDownload(url, assetBundleVersion)

Page 33: AssetBundle (もどき) の作り方

AssetBundle って?• イケてるところ

• 簡単に構築できる

• よしなにキャッシュしてくれる

• 複数ファイルを纏められる

• Unity による Asset 最適化が効く

Page 34: AssetBundle (もどき) の作り方

AssetBundle って?AB 名を付ける際に同じ名前にすればOK

Page 35: AssetBundle (もどき) の作り方

AssetBundle って?• イケてるところ

• 簡単に構築できる

• よしなにキャッシュしてくれる

• 複数ファイルを纏められる

• Unity による Asset 最適化が効く

Page 36: AssetBundle (もどき) の作り方

AssetBundle って?Import Assets (↓) の変換結果がちゃんと効く

Page 37: AssetBundle (もどき) の作り方

AssetBundle って?• イケてないところ (本題)

• キャッシュを柔軟に管理できない

• 標準では暗号化してくれない

• Content-Type 縛り

• 取得・展開の流れが煩雑

Page 38: AssetBundle (もどき) の作り方

AssetBundle って?• イケてないところ (本題)

• キャッシュを柔軟に管理できない

• 標準では暗号化してくれない

• Content-Type 縛り

• 取得・展開の流れが煩雑

Page 39: AssetBundle (もどき) の作り方

AssetBundle って?• Caching.CleanCache() で一括削除できる

• 以上!

• 個別削除はできません!!

• ダミーの CRC 食わせて云々という手もダメでした

Page 40: AssetBundle (もどき) の作り方

AssetBundle って?

Why? Japanese peaple!?

Page 41: AssetBundle (もどき) の作り方

AssetBundle って?• 基本的にアプリサイズは増え続けます

• 1アプリで2GB越えも夢じゃないっ!

• 上位 ver. で上書きするわけじゃないっぽい

• 一括削除ボタン設置して、ユーザの意志で消させる?キャッシュ上限設定して頑張る?有効期限で工夫する?

Page 42: AssetBundle (もどき) の作り方

AssetBundle って?

自分で頑張りましょう。

Page 43: AssetBundle (もどき) の作り方

AssetBundle って?• イケてないところ (本題)

• キャッシュを柔軟に管理できない

• 標準では暗号化してくれない

• Content-Type 縛り

• 取得・展開の流れが煩雑

Page 44: AssetBundle (もどき) の作り方

AssetBundle って?Unity Manual にやり方載ってるよ!

Page 45: AssetBundle (もどき) の作り方

AssetBundle って?

自分で頑張りましょう。

Page 46: AssetBundle (もどき) の作り方

AssetBundle って?• イケてないところ (本題)

• キャッシュを柔軟に管理できない

• 標準では暗号化してくれない

• Content-Type 縛り

• 取得・展開の流れが煩雑

Page 47: AssetBundle (もどき) の作り方

AssetBundle って?• Content-Type: application/vnd.unityじゃないとダウンロードできない

• Unity 5 系では直ってるかも?

• せめて application/octet-stream あたりは許容していただきたい…

Page 48: AssetBundle (もどき) の作り方

AssetBundle って?

自分で頑張りましょう。

Page 49: AssetBundle (もどき) の作り方

AssetBundle って?• イケてないところ (本題)

• キャッシュを柔軟に管理できない

• 標準では暗号化してくれない

• Content-Type 縛り

• 取得・展開の流れが煩雑

Page 50: AssetBundle (もどき) の作り方

AssetBundle って?• WWW.LoadFromCacheOrDownload() が用意されている

• 「用意はしたが、そのまま使えるとは言っていない。」

• タイムアウト処理は?並列ダウンロードは?DL後の後始末は?メモリ展開したモノってどーすりゃいいの?

Page 51: AssetBundle (もどき) の作り方

AssetBundle って?

自分で頑張りましょう。

Page 52: AssetBundle (もどき) の作り方

………。

Page 53: AssetBundle (もどき) の作り方

実際に、作ってみた。

Page 54: AssetBundle (もどき) の作り方

作ってみた• 機能要件は以下の通り

• 圧縮・解凍

• 暗号化・複合化

• 簡素な取得・展開

• キャッシュ個別削除

• 変換された Asset を利用

Page 55: AssetBundle (もどき) の作り方

作ってみた• 機能要件は以下の通り

• 圧縮・解凍

• 暗号化・複合化

• 簡素な取得・展開

• キャッシュ個別削除

• 変換された Asset を利用

Page 56: AssetBundle (もどき) の作り方

作ってみた• iOS/Android 実機だと DeflateStream が使えない問題

• → DotNetZip 使いましょう。

• オプションとして無圧縮を選べるとオシャレ

• 現時点では複数 Asset を纏めるのは未対応

Page 57: AssetBundle (もどき) の作り方

作ってみた• 機能要件は以下の通り

• 圧縮・解凍

• 暗号化・複合化

• 簡素な取得・展開

• キャッシュ個別削除

• 変換された Asset を利用

Page 58: AssetBundle (もどき) の作り方

作ってみた• AES とかでよしなに

• やり方はググりましょう。

• 鍵の管理は検討課題

• 複合はそれなりに CPU コスト掛かる

• これもオプションで選べると Good

Page 59: AssetBundle (もどき) の作り方

作ってみた• 機能要件は以下の通り

• 圧縮・解凍

• 暗号化・複合化

• 簡素な取得・展開

• キャッシュ個別削除

• 変換された Asset を利用

Page 60: AssetBundle (もどき) の作り方

作ってみた• Load() メソッド的なモノに delegate 渡せるようにするとか、コールバックメソッドに SendMessage するとか、やり方は色々ある

• この辺は、会社毎・プロジェクト毎に柔軟に書いちゃえば良いんじゃないかと

Page 61: AssetBundle (もどき) の作り方

作ってみた• 機能要件は以下の通り

• 圧縮・解凍

• 暗号化・複合化

• 簡素な取得・展開

• キャッシュ個別削除

• 変換された Asset を利用

Page 62: AssetBundle (もどき) の作り方

作ってみた• メイン機能w

• 何気に難しい

• 存在するABの一覧とDL済のABの一覧を別々に管理する必要がある

• バージョニング対応なんかも

Page 63: AssetBundle (もどき) の作り方

作ってみた• 機能要件は以下の通り

• 圧縮・解凍

• 暗号化・複合化

• 簡素な取得・展開

• キャッシュ個別削除

• 変換された Asset を利用

Page 64: AssetBundle (もどき) の作り方

作ってみた• ここも何気に難しい

• 各プラットフォーム毎に Import Assets によって変換された Asset から生データを取得する必要がある

• Asset 毎に取得の仕方が異なる

• 復元するために必要となる付加情報も管理する

Page 65: AssetBundle (もどき) の作り方

作ってみた• Texture の場合

• Texture2D.GetRawTextureData() を使う

• width/height の他に圧縮フォーマットも付加情報として持っておくと吉

Page 66: AssetBundle (もどき) の作り方

作ってみた• AudioClip の場合

• AudioClip.GetData() を使う

• length, frequency, channels あたりを 付加情報に持つ感じ

• 注意点としては AudioClip の LoadType が Decompress on Load じゃないとGetData() の結果が空になる

Page 67: AssetBundle (もどき) の作り方

作ってみた• 他の Asset の場合

• やったことないから分からんw

• けど、何らかの方法で取得できるかと。

Page 68: AssetBundle (もどき) の作り方

まとめ

Page 69: AssetBundle (もどき) の作り方

まとめ• 「個別削除」というシンプルな機能を実現するために支払う犠牲は決して安くない。

• AssetBundle が持つ機能を 100% 再現 させるのは現時点では難しい。(AudioClip 的な意味で)

• 依存性の排除が出来たら AssetStore で公開するかも。

Page 70: AssetBundle (もどき) の作り方

おまけ

Page 71: AssetBundle (もどき) の作り方

iOS 9 の ATS• ATS (Application Transport Security) がiOS 9 SDK でビルドすると有効になる

• 端的に言うと「セキュアじゃないサーバとは通信させません!」という機能

• AssetBundle のダウンロードもご多分に漏れず該当し得る

Page 72: AssetBundle (もどき) の作り方

iOS 9 の ATS• 開発者がやるべきコトは以下の通り

• AB 置き場のサーバを https 対応する

• その際 TLS 1.2 にしたり暗号化アルゴリズムを堅めにしたりする必要あり

• AB のダウンロード URL を https にする

Page 73: AssetBundle (もどき) の作り方

iOS 9 の ATS• http → https の URL 自動置換が働くなんて噂も あったけど、あれ、嘘です。

• iOS 9 SDK (Xcode 7) でビルドしない限り該当は しないけど、早めに対応しとくのが吉。

• 置き場が CloudFront の場合、 暗号化アルゴリズムが弱めな証明書使っているので、独自証明書にするか、 別の場所に置くかしないと NG。

• →年内には解消するそうです。

Page 74: AssetBundle (もどき) の作り方

Thank you foryour attention !!

Page 75: AssetBundle (もどき) の作り方

Any Questions ?