Resourcesフォルダーの衝撃的な話
皆さん、知っていましたでしょうか・・・
Unityで手軽にソースコードからプレハブなどを読み込む関数、Resources.Load
このResourcesシステムの公式ベストプラクティス第一文にはこうあります。
Don't use it.
つまり使うな、と。
使っちゃいけない理由
なんでなん・・・なんで使っちゃいかんのん・・・
- 細かなメモリの管理がとても難しくなります。
- アプリの起動時に必ずResourcesフォルダ全部を読み込むため、起動が遅くなります。ビルド時間も長くなります。
- しかも何を入れ何を外すかは重要なのに、Resourceフォルダの数が増えるほど管理が複雑になります。
- アセットの内容をすべてのデバイス向けとして用意する必要があり、プラットフォームごとやバージョンごとでのアップグレードができません。
- AssetBundleを使えばデバイス向けに用意するアセットを切り替えることができます。
つまりResourcesフォルダの中身が増えるほど起動もビルドも重くなるし、
アプリの動作が重くなってく可能性高いし、
対応バージョンとかOSが複数あったら一部に対応できない機能とか気軽に入れられないし、
総合的に見てResourcesフォルダはボトルネックになりやすい、とのこと。
じゃあどうすればいいの?
Unity的には、アセット周りはだいたいAssetBundle使えばいいよって推奨してるんじゃないかな。
AssetBundleのアセットシリアライズ方式も、Resourcesと大体一緒みたいだけど、
Resourcesは一括で1個のファイルにシリアライズするのに比べてAssetBundleは分割できるとかあるので、読み込み時間問題は分割して解決してねって感じで。
使ってもいい場合
さて、そんな**Don't use it.**な Resourcesシステムですが、こんな場合は使っても良いんだよ、とUnityも言っています。
- モックなど、実装速度が必要なプロジェクトの実装(製品版では使わないこと)
- プロジェクトの全体を通して必要なリソースの場合
- メモリを消費しないリソースの場合
- 初期起動のロードなどを最小限にすませるために使う場合
感想
このベストプラクティスを見たときは衝撃でした・・・
Unityでずっと使ってたよく使う機能だったのに・・・
ずっと使ってた機能が非推奨になったり、こんなふうに機能としては使えるままに推奨されなくなったりするので、要注意ですね。
参考:The Resources folder
https://unity3d.com/jp/learn/tutorials/topics/best-practices/resources-folder