assetbundle (もどき) の作り方

Post on 18-Jan-2017

4.958 Views

Category:

Engineering

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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 Sto

re / Goo

gle 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 foryour attention !!

Any Questions ?

top related