【Unity】実行中にまとめてアセットをロードする

Resources.LoadAllは、Unityで特定のフォルダ内のすべてのアセットをロードするために使用されるメソッドです。このメソッドは、指定されたパスにあるResourcesフォルダ内のすべてのアセットをロードし、それらを配列として返します。これは、特定のカテゴリーのアセットを一度にロードする必要がある場合に便利です。

指定したアセットだけのロードの場合

使用方法

Resources.LoadAllメソッドの基本的な使用法は以下の通りです

using UnityEngine;

public class LoadAllAssets : MonoBehaviour
{
    void Start()
    {
        // "Items"フォルダ内のすべてのアセットをロードします
        Object[] items = Resources.LoadAll("Items");

        // ロードしたアセットの一覧をログに出力
        foreach (var item in items)
        {
            Debug.Log(item.name);
        }
    }
}

この例では、Resourcesフォルダ内のItemsサブフォルダからすべてのアセットをロードしています。Resources.LoadAllObject[]配列を返すため、ロードされた各アセットに対して繰り返し処理を行い、それらの名前をログに出力しています。

引数と戻り値

Resources.LoadAllは、次のような形式で使用します

Resources.LoadAll<T>(string path)
  • path: Resourcesフォルダ内のアセットが含まれるサブフォルダのパスです。このパスはResourcesフォルダからの相対パスで指定します。
  • T: ロードしたいアセットの型です。指定した型に基づいてフィルタリングされ、その型のアセットのみが配列として返されます。型を指定しない場合は、すべてのアセットがObject型としてロードされます。

注意点

  • パフォーマンス: Resources.LoadAllは指定されたパス内のすべてのアセットを一度にロードするため、大量のアセットが存在する場合はメモリ使用量が大きくなり、パフォーマンスに影響を与える可能性があります。
  • 管理の難しさ: Resourcesシステムは管理が難しい場合があります。アセットの種類や数が多くなると、どのアセットがどのタイミングでロードされているか追跡しにくくなります。

Resources.LoadAllは、特定の条件下で非常に有用ですが、大規模なプロジェクトやリソースの効率的な管理が求められる場合は、よりモダンなアセット管理システム(例えばAddressables)の使用が推奨されます。

代替手段(Addressable)

Resources.LoadAllの機能をAddressable Asset Systemで置き換えることは、Unityプロジェクトのアセット管理を大幅に改善し、より効率的で拡張可能な方法でリソースを扱うことができます。Addressablesシステムは、特に大規模なゲームやアプリケーションにおいて、リソースのロードとアンロードを効率的に行うことが可能です。

Addressablesでの「LoadAll」相当の実装

Addressablesを使用して特定のグループまたはラベルのすべてのアセットをロードする方法は、Resources.LoadAllと似ていますが、より多くの柔軟性と機能を提供します。

以下は、特定のラベルを使用してAddressablesから複数のアセットを非同期でロードする一例です

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using System.Collections.Generic;

public class LoadAllAssetsWithAddressables : MonoBehaviour
{
    void Start()
    {
        // 特定のラベルに基づいてアセットをロードする関数を呼び出します
        LoadAssetsByLabel("myLabel");
    }

    // 指定されたラベルを持つすべてのアセットを非同期でロードする関数
    void LoadAssetsByLabel(string label)
    {
        // Addressables.LoadAssetsAsyncを使用して、非同期にアセットをロードします。
        // ロードが完了すると、OnAssetLoadedが各アセットに対して呼び出されます。
        // 全てのアセットのロードが完了した時の処理は、OnAllAssetsLoadedで行います。
        Addressables.LoadAssetsAsync<GameObject>(label, OnAssetLoaded).Completed += OnAllAssetsLoaded;
    }

    // アセットが一つロードされるたびに呼び出されるコールバック関数
    void OnAssetLoaded(GameObject asset)
    {
        // ロードされたアセットの名前をログに出力
        Debug.Log($"Loaded: {asset.name}");
        
        // ロードしたアセットをシーンにインスタンス化する
        Instantiate(asset, Vector3.zero, Quaternion.identity);
    }

    // 全てのアセットのロードが完了した後に呼び出されるコールバック関数
    void OnAllAssetsLoaded(AsyncOperationHandle<IList<GameObject>> handle)
    {
        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            // 全てのアセットが正常にロードされた場合、成功メッセージをログに出力
            Debug.Log("全てのアセットが正常にロードされました。");
        }
        else
        {
            // ロードに失敗した場合、エラーメッセージをログに出力
            Debug.LogError("アセットのロードに失敗しました。");
        }
    }
}

Addressablesの利点

  1. パフォーマンスと最適化:
    • Addressablesは必要に応じてリソースをロードし、不要になったリソースをアンロードすることができます。これにより、メモリ使用量とロード時間を最適化できます。
  2. ネットワーク経由でのロード:
    • ローカルだけでなく、リモートからもアセットをロードできます。これにより、アプリケーションの初期ダウンロードサイズを小さく保ちつつ、後からコンテンツを追加することが可能です。
  3. バージョン管理と更新:
    • アセットを個別に更新できるため、全体のビルドを再デプロイすることなく、特定のアセットのみを更新することができます。
  4. 複数プラットフォームのサポート:
    • 異なるプラットフォームやデバイス特性に基づいて最適なアセットをロードすることが可能です。

まとめ

Resources.LoadAllからAddressablesへの移行は、開発の柔軟性を向上させ、リソース管理をより効率的に行えるようにします。大規模プロジェクトやリアルタイムでのアセット更新が求められるプロジェクトにおいて、Addressablesは強力なツールです。

Unity

Posted by hidepon