Unityを使用していると、画像や音声、モデルなどのアセットを管理する際に、
Resourcesフォルダが便利です。
Resourcesフォルダは比較的簡単に使える方法のひとつですが、公式では非推奨とされています。
本記事では、Resourcesフォルダの基本的な使い方と、それが非推奨とされる理由、
さらに代替手段について解説します。
- Unityで複数のアセットを効率的に管理したい方
- Resourcesフォルダの使い方に疑問を持っているUnityユーザー
- 非推奨な方法を知りたい開発者
- パフォーマンスに影響を与えないアセット管理方法を知りたい方
- スクリプトでアセットを動的に扱いたい方
Resourcesフォルダとは?
Resourcesフォルダは、Unityのプロジェクト内で特別な役割を持つフォルダです。
プロジェクト内の任意の場所に作成することができ、このフォルダに配置されたすべてのアセットは、
ビルド時に自動的に含まれ、動的にロードすることができます。
この仕組みを活用することで、スクリプトからアセットを簡単に呼び出すことが可能です。
csvの保存も可能で、テキストを出力したり、画像や音声をパス管理したりできます。
素材を簡単に扱えることの他に、Resourcesフォルダを使うメリットは様々です。
Resourcesフォルダが非推奨な理由
Resourcesフォルダの利用には便利な面が多い反面、デメリットが存在し、
Unity公式ではこのフォルダの使用を推奨していません。
公式サイト:「Resources フォルダー – Unity マニュアル」
まず、ビルドサイズの増加が挙げられます。
Resourcesフォルダ内のすべてのアセットは、使用されていなくてもビルドに含まれるため、
ビルドサイズが大きくなりがちになります。
メモリ管理が困難で、 一度ロードされたアセットは、
メモリから明示的に解放されるまで保持され続けるため、メモリの使用効率が悪化します。
参照の追跡が困難なため、Resourcesフォルダ内のアセットはコードで動的に参照されて、
どのアセットがどこで使われているかが追跡しにくく、バグの原因になりやすいです。
ロード時間の増加によりビルド時にすべてのResourcesフォルダのアセットが含まれるため、
アセットの数が多くなるとロード時間が増加します。
管理の複雑さも関連します。プロジェクトが大規模になると、アセット管理が難しくなり、
予期せぬバグやメモリリークが発生する可能性があります。
代わりとなる素材やアセット管理
このように、大規模なプロジェクトの場合、Resourcesフォルダを避ける必要があります。
Resourcesフォルダの代替案を検討することが推奨されています。
UdemyでPythonを学習
Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。
ビックセール開催中(12月19日まで)
対象のコースが1500円から(最大95%OFF)
- 現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
Pythonをインストールから環境設定、基本文法が学習
さらに暗号化、インフラ自動化、非同期処理についても学べます。
Pythonを基礎から応用まで学びたい人におすすめ
- みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習 【2024年最新版】
機械学習ライブラリで文字認識や株価分析などを行う。
人口知能やニューラルネットワーク、機械学習を学びたい人におすすめ。
- 【世界で55万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜
統計分析、機械学習の実装、ディープラーニングの実装を学習。
データサイエンティストになりたい人におすすめ。
- 0から始めるTkinterの使い方完全マスター講座〜Python×GUIの基礎・応用〜
TkinterのGUIを作成から発展的な操作までアプリ実例を示して学習。
アプリ開発したい人におすすめ。
スクリプトで扱う方法
スクリプトでアセットを扱う場合、アドレッサブルやAssetBundlesを使うことで、
動的にアセットをロードしつつ、Resourcesフォルダのデメリットを回避することができます。
アドレッサブルシステムを使用すれば、特定のアセットを簡単に呼び出すことが可能です。
インストールには、「package Maneger」を使用します。
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class AssetLoader : MonoBehaviour
{
void Start()
{
Addressables.LoadAssetAsync<GameObject>("MyPrefabKey").Completed += OnLoadDone;
}
void OnLoadDone(AsyncOperationHandle<GameObject> obj)
{
if (obj.Status == AsyncOperationStatus.Succeeded)
{
GameObject myPrefab = obj.Result;
Instantiate(myPrefab);
}
}
}
まとめ
UnityのResourcesフォルダは、手軽にアセットを動的に管理できる便利な機能ですが、非推奨とされる理由も多く存在します。主な問題は、ビルドサイズの増加やメモリ管理の難しさ、アセット参照の追跡が困難になることなどです。
これらのデメリットを避け、プロジェクトの効率とパフォーマンスを最適化するためには、
代替手段として「アドレッサブルシステム」や「AssetBundles」を利用することが推奨されます。
特に、アドレッサブルシステムを活用すれば、スクリプトを通じて動的にアセットを管理しつつ、Resourcesフォルダの持つ問題点を回避できます。
これにより、プロジェクトの規模が大きくなってもパフォーマンスやメモリ効率を保ちながら開発を進めることが可能です。