(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

Resourcesフォルダのベストプラクティス【Unity】【最適化】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2017.3.1f1


はじめに

Unityには公式のチュートリアルがあるのですが、

その中にResourcesフォルダのベストプラクティスなるものを発見し、

気になったので勉強ついでに記事にしてみました!



なお、ベストプラクティスとは最も効率の良い方法の事ですが、

Unityのバージョンや対象のプラットフォーム、開発状況や開発者の能力、ゲームの規模や種類等、

様々な要因によって最善の方法、実現可能な方法は変わってくるので、

常にこの方法が最高!この方法でないとダメ!というわけではありません。


Resourcesフォルダのベストプラクティスは使用しない事である

いきなりResourcesファルダ全否定ですが、実際に公式でそのような事が書かれています。


f:id:kan_kikuchi:20180211211952j:plain

Best Practices for the Resources System
Don't use it.

Google翻訳
リソースシステムのベストプラクティス
それを使用しないでください。

Unity - The Resources folder


ちなみにNintendo Switch向けの開発でもResourcesは最小限にと言われています。(Unity公式情報)


f:id:kan_kikuchi:20180211210930j:plain
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!


Resourcesを使わない方が良い理由は大きく分けて以下の3つです。


メモリ管理が大変になる

理由の記載はないのですが、おそらくResourcesフォルダは簡単にロード出来る反面(故に?)、

アンロードの処理を怠りがち、かつ、開放したつもりでも開放出来てない事がある(参照が残ってるとか)

からメモリ管理が大変になるのだと思われます。





ビルド時間、 アプリの起動時間が長くなる

実はResourcesフォルダの中身はビルド時に一つのファイルにまとめられています。

(恐らくそれでビルド時間が長くなる。)

しかも、そのファイルのメタデータとインデックス情報を起動時に読み込む必要があるため

Resourcesフォルダの中身が増えるほど起動時間も増してしまいます。


段階的なアップデートが大変になる

前述の通り、Resourcesフォルダの中身はビルド時に一つのファイルにまとめられるため、

「アップデート時に変更があった所だけ差し替える」という事ができず、

Resourcesフォルダを丸々差し替える事になります。

つまりアップデートの度に(変更があれば)Resourcesフォルダ分、丸々容量が増えます。


ただし、これはパッチを作成する場合の話なので、

iOSやAndroidのように実行ファイルを置き換えるアップデートの場合には当てはまりません。


Resourcesフォルダが使えないならどうしたら良いの?

答えは簡単、AssetBundleを使いましょう。

AssetBundleとはなんぞや?どう使うの?という方は以下の記事をどうぞ。



AssetBundleを使えば、少なくともアプリの起動時間とアップデートの問題は解決されます。

ただし、個人的にはメモリ管理とビルド時間の問題はあんまり変わっていない(むしろ増す?)と思います。

さらにResourcesフォルダ以上に癖がありますし、手間も増えます。


ちなみに、AssetBundleというとサーバーを使うイメージがあるかもしれませんが、

StreamingAssetsというフォルダに入れれば、ローカルから使う事も可能です。

ただし、全プラットフォームのAssetBundleを入れてしまうと容量がえらい事になるので、

ビルド時に移動する処理が必要になります。



なお、AssetBundle関連のベストプラクティス(英語&長文)もありますが、

これはまた別のお話。(まだ読んでない。)






Resourcesフォルダの使い所はないの?

もちろんそんな事はなく、活躍する場面もあります。


例えば、とりあえず動くものを作ってみよう!メイン部分だけ作って面白いか確認してみよう!

みたいな試作段階では、速さが特に重要なってくるのでResourcesフォルダが役に立ちます。


また、前述したiOSやAndroidのような

アップデートの問題と無関係なプラットフォームだけにしかリリースしない場合

アップデートしても絶対に変更しないファイルがある場合

Resourcesフォルダを使っても大丈夫でしょう。

ただし、後々リリースするプラットフォームが増えたり、

絶対に変更しない予定がリリース後に変更が生じてしまうと泣きを見ることになりますが……。


おわりに

まとめると「基本的にResourcesを使わず、AssetBundleを使う」というのが、

Resourcesフォルダのベストプラクティスでした。

ただし、最初に書いた通り常にこの方法が最高!この方法でないとダメ!というわけではありません。


特にUnityを使い始めたてだったり、スマホ以外にリリースを考えてない場合は

一旦AssetBundleの事は忘れて、Resourcesフォルダのみでも大丈夫だと思います。


もちろん早めにAssetBundleを使って、慣れるに越したことはありませんが、

そこで躓いてゲームが完成しないと元も子もないのですからね。