Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

AssetBundle (もどき) の作り方

14,034 views

Published on

2015年09月25日 (金) に開催された「第34回 Unity 勉強会」での発表資料です。

Unity が提供する AssetBundle の機能を褒めたり Dis ったりする内容となっていますw
AssetBundle をアプリとかに実装する話は含まれませんので、ご注意ください。

Published in: Engineering
  • Be the first to comment

AssetBundle (もどき) の作り方

  1. 1. AssetBundle (もどき)
 の作り方 ∼ AssetBundle がイケてないから、 車輪の再発明をしてやったぜ!っておはなし ∼ 2015.09.25 (Fri) / Unity 勉強会 #34 株式会社キッズスター システムデベロプメントチーム リーダー 森 哲哉
  2. 2. こんばんは!
  3. 3. "自己紹介が
 スライドの
 半分を占める"
  4. 4. でお馴染みの もんりぃです!
  5. 5. 今日は
  6. 6. AssetBundle
  7. 7. の、機能そのものを 作ってみた。
  8. 8. という おはなしです。
  9. 9. おしながき
  10. 10. おしながき • AssetBundle のおさらい • AssetBundle (もどき) を作ってみた • おまけ
  11. 11. さて、本題
  12. 12. の、前に
  13. 13. 自己紹介
  14. 14. whoami • 森 哲哉 と申します • a.k.a: もんりぃ / T: @monry / F: monry84 • 明日31歳 / ♂ / O型 / 天 座 / 既婚 • 趣味は「お酒」と「合唱」です
  15. 15. whoami • 大学を (自主的に) 卒業後、ベンチャーを転々 • Web のフロントエンド、サーバサイドが得意 • Unity 歴 2 年くらい • インフラ (AWS) も、ちょいちょいやってます • Cocos2d-JS も触ってます
  16. 16. jobs • 株式会社キッズスター って会社で働いてます • 未就学児∼小学生のお子さまをお持ちの
 ファミリーをターゲットにした、知育/教育に
 関わるアプリ・サービスを展開しております • 「IID 世田谷ものづくり学校」という、
 元中学校に入居しております
  17. 17. office
  18. 18. office
  19. 19. apps なりきり!! ごっこランド パズル&テイルズ
 おかしのくにを つくるのじゃ!! なりきり!! アイスクリーム 屋さんごっこ なりきり!! ママごっこ お弁当をつくろう! おかしの家を つくろう! ハンバーガー やさんごっこ 飛行機を 組み立てよう! i18n i18n i18n i18n ゆかいな お花屋さん App Store / Google Play カテゴリランキング1位 多数獲得!!! きかんしゃ トーマスと パズルで あそぼう! キョロちゃん 大冒険
  20. 20. events
  21. 21. events
  22. 22. 今度こそ、本題
  23. 23. AssetBundle の おさらい
  24. 24. AssetBundle って? • Unity 公式 • DLC のための仕組み • Unity 5 からは Standard 版でも使える • (基本的には) どんな Asset も AB 化できる
  25. 25. AssetBundle って? • AB 準備の流れ • AB 名設定 • スクリプトから一括構築 • サーバにデプロイ
  26. 26. AssetBundle って? • AB 利用の流れ • サーバから取得 • 端末ストレージにキャッシュ • メモリに展開 • インスタンス化
  27. 27. AssetBundle って? • イケてるところ • 簡単に構築できる • よしなにキャッシュしてくれる • 複数ファイルを纏められる • Unity による Asset 最適化が効く
  28. 28. AssetBundle って? • イケてるところ • 簡単に構築できる • よしなにキャッシュしてくれる • 複数ファイルを纏められる • Unity による Asset 最適化が効く
  29. 29. AssetBundle って? Inspector 下部のフォームで名前付けて…
  30. 30. 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
 );
 }
 
 }
  31. 31. AssetBundle って? • イケてるところ • 簡単に構築できる • よしなにキャッシュしてくれる • 複数ファイルを纏められる • Unity による Asset 最適化が効く
  32. 32. AssetBundle って? WWW クラスに専用のメソッドがある WWW.LoadFromCacheOrDownload(url, assetBundleVersion)
  33. 33. AssetBundle って? • イケてるところ • 簡単に構築できる • よしなにキャッシュしてくれる • 複数ファイルを纏められる • Unity による Asset 最適化が効く
  34. 34. AssetBundle って? AB 名を付ける際に同じ名前にすればOK
  35. 35. AssetBundle って? • イケてるところ • 簡単に構築できる • よしなにキャッシュしてくれる • 複数ファイルを纏められる • Unity による Asset 最適化が効く
  36. 36. AssetBundle って? Import Assets (↓) の変換結果がちゃんと効く
  37. 37. AssetBundle って? • イケてないところ (本題) • キャッシュを柔軟に管理できない • 標準では暗号化してくれない • Content-Type 縛り • 取得・展開の流れが煩雑
  38. 38. AssetBundle って? • イケてないところ (本題) • キャッシュを柔軟に管理できない • 標準では暗号化してくれない • Content-Type 縛り • 取得・展開の流れが煩雑
  39. 39. AssetBundle って? • Caching.CleanCache() で一括削除できる • 以上! • 個別削除はできません!! • ダミーの CRC 食わせて云々という手もダメでした
  40. 40. AssetBundle って? Why? Japanese peaple!?
  41. 41. AssetBundle って? • 基本的にアプリサイズは増え続けます • 1アプリで2GB越えも夢じゃないっ! • 上位 ver. で上書きするわけじゃないっぽい • 一括削除ボタン設置して、ユーザの意志で消させ る?キャッシュ上限設定して頑張る?有効期限で 工夫する?
  42. 42. AssetBundle って? 自分で頑張りましょう。
  43. 43. AssetBundle って? • イケてないところ (本題) • キャッシュを柔軟に管理できない • 標準では暗号化してくれない • Content-Type 縛り • 取得・展開の流れが煩雑
  44. 44. AssetBundle って? Unity Manual にやり方載ってるよ!
  45. 45. AssetBundle って? 自分で頑張りましょう。
  46. 46. AssetBundle って? • イケてないところ (本題) • キャッシュを柔軟に管理できない • 標準では暗号化してくれない • Content-Type 縛り • 取得・展開の流れが煩雑
  47. 47. AssetBundle って? • Content-Type: application/vnd.unity
 じゃないとダウンロードできない • Unity 5 系では直ってるかも? • せめて application/octet-stream あたりは
 許容していただきたい…
  48. 48. AssetBundle って? 自分で頑張りましょう。
  49. 49. AssetBundle って? • イケてないところ (本題) • キャッシュを柔軟に管理できない • 標準では暗号化してくれない • Content-Type 縛り • 取得・展開の流れが煩雑
  50. 50. AssetBundle って? • WWW.LoadFromCacheOrDownload() が
 用意されている • 「用意はしたが、そのまま使えるとは
 言っていない。」 • タイムアウト処理は?並列ダウンロードは?DL 後の後始末は?メモリ展開したモノってどーすりゃ いいの?
  51. 51. AssetBundle って? 自分で頑張りましょう。
  52. 52. ………。
  53. 53. 実際に、作ってみた。
  54. 54. 作ってみた • 機能要件は以下の通り • 圧縮・解凍 • 暗号化・複合化 • 簡素な取得・展開 • キャッシュ個別削除 • 変換された Asset を利用
  55. 55. 作ってみた • 機能要件は以下の通り • 圧縮・解凍 • 暗号化・複合化 • 簡素な取得・展開 • キャッシュ個別削除 • 変換された Asset を利用
  56. 56. 作ってみた • iOS/Android 実機だと DeflateStream が
 使えない問題 • → DotNetZip 使いましょう。 • オプションとして無圧縮を選べるとオシャレ • 現時点では複数 Asset を纏めるのは未対応
  57. 57. 作ってみた • 機能要件は以下の通り • 圧縮・解凍 • 暗号化・複合化 • 簡素な取得・展開 • キャッシュ個別削除 • 変換された Asset を利用
  58. 58. 作ってみた • AES とかでよしなに • やり方はググりましょう。 • の管理は検討課題 • 複合はそれなりに CPU コスト掛かる • これもオプションで選べると Good
  59. 59. 作ってみた • 機能要件は以下の通り • 圧縮・解凍 • 暗号化・複合化 • 簡素な取得・展開 • キャッシュ個別削除 • 変換された Asset を利用
  60. 60. 作ってみた • Load() メソッド的なモノに delegate 渡せるよ うにするとか、コールバックメソッドに SendMessage するとか、やり方は色々ある • この辺は、会社毎・プロジェクト毎に柔軟に書 いちゃえば良いんじゃないかと
  61. 61. 作ってみた • 機能要件は以下の通り • 圧縮・解凍 • 暗号化・複合化 • 簡素な取得・展開 • キャッシュ個別削除 • 変換された Asset を利用
  62. 62. 作ってみた • メイン機能w • 何気に難しい • 存在するABの一覧とDL済のABの一覧を
 別々に管理する必要がある • バージョニング対応なんかも
  63. 63. 作ってみた • 機能要件は以下の通り • 圧縮・解凍 • 暗号化・複合化 • 簡素な取得・展開 • キャッシュ個別削除 • 変換された Asset を利用
  64. 64. 作ってみた • ここも何気に難しい • 各プラットフォーム毎に Import Assets に
 よって変換された Asset から生データを
 取得する必要がある • Asset 毎に取得の仕方が異なる • 復元するために必要となる付加情報も管理する
  65. 65. 作ってみた • Texture の場合 • Texture2D.GetRawTextureData() を使う • width/height の他に圧縮フォーマットも
 付加情報として持っておくと吉
  66. 66. 作ってみた • AudioClip の場合 • AudioClip.GetData() を使う • length, frequency, channels あたりを
 付加情報に持つ感じ • 注意点としては AudioClip の LoadType が
 Decompress on Load じゃないと
 GetData() の結果が空になる
  67. 67. 作ってみた • 他の Asset の場合 • やったことないから分からんw • けど、何らかの方法で取得できるかと。
  68. 68. まとめ
  69. 69. まとめ • 「個別削除」というシンプルな機能を
 実現するために支払う犠牲は決して安くない。 • AssetBundle が持つ機能を 100% 再現
 させるのは現時点では難しい。
 (AudioClip 的な意味で) • 依存性の排除が出来たら AssetStore で
 公開するかも。
  70. 70. おまけ
  71. 71. iOS 9 の ATS • ATS (Application Transport Security) が
 iOS 9 SDK でビルドすると有効になる • 端的に言うと「セキュアじゃないサーバとは通 信させません!」という機能 • AssetBundle のダウンロードもご多分に漏れず 該当し得る
  72. 72. iOS 9 の ATS • 開発者がやるべきコトは以下の通り • AB 置き場のサーバを https 対応する • その際 TLS 1.2 にしたり暗号化アルゴリズム を堅めにしたりする必要あり • AB のダウンロード URL を https にする
  73. 73. iOS 9 の ATS • http → https の URL 自動置換が働くなんて も
 あったけど、あれ、嘘です。 • iOS 9 SDK (Xcode 7) でビルドしない限り該当は
 しないけど、早めに対応しとくのが吉。 • 置き場が CloudFront の場合、 暗号化アルゴリズムが
 弱めな証明書使っているので、独自証明書にするか、
 別の場所に置くかしないと NG。 • →年内には解消するそうです。
  74. 74. Thank you for
 your attention !!
  75. 75. Any Questions ?

×