UnityにおけるPrefab生成とAddressable活用チュートリアル

1. Prefab生成の基礎とチュートリアル

1.1. Prefab生成の概要

Unityでは、Instantiate関数を利用してInspector上で登録したPrefabをシーン内に生成(インスタンス化)することができます。これにより、ゲーム中に動的なオブジェクト生成が可能となります。

1.2. ステップバイステップチュートリアル(Instantiateを使用)

ステップ1: Prefabの作成

  • シーン内にオブジェクトを配置: ヒエラルキーにCubeなどのオブジェクトを追加し、好みの調整を行う。
  • Prefab化: 作成したオブジェクトをプロジェクトウィンドウにドラッグ&ドロップしてPrefabに変換します。

ステップ2: スクリプトの作成

  • 新規C#スクリプト作成: 「PrefabSpawner.cs」という名前で作成します。
  • 以下のコードを貼り付けます:
using UnityEngine;

public class PrefabSpawner : MonoBehaviour
{
    // InspectorからPrefabを設定するための変数
    public GameObject prefab;

    void Start()
    {
        // 位置と回転を指定してPrefabからインスタンスを生成
        Instantiate(prefab, Vector3.zero, Quaternion.identity);
    }
}

ステップ3: スクリプトの適用と動作確認

  • シーン内に空のGameObjectを作成: 「Spawner」などの名前を付けます。
  • 作成したPrefabSpawnerスクリプトをドラッグ&ドロップでアタッチ。
  • InspectorからPrefabをスクリプトのprefabフィールドにセット。
  • シーンを再生: シーンが開始されると、指定した位置にPrefabのインスタンスが生成されることを確認してください。

補足:Resourcesフォルダを利用する場合

  • ResourcesフォルダにPrefabを配置: プロジェクト内にResourcesという名前のフォルダを作成し、その中にPrefabを配置します。
  • スクリプト例(Resources.Loadを使用):
using UnityEngine;

public class PrefabSpawner : MonoBehaviour
{
    void Start()
    {
        // "MyPrefab"はResourcesフォルダ内のPrefab名
        GameObject prefab = Resources.Load<GameObject>("MyPrefab");
        Instantiate(prefab, new Vector3(0, 0, 0), Quaternion.identity);
    }
}

2. Addressableアセット管理の基礎とチュートリアル

2.1. Addressableの概要

Addressableシステムを使用すると、以下のようなメリットがあります。

  • 非同期ロード: バックグラウンドでアセットを読み込み、パフォーマンスへの影響を軽減
  • 効率的なメモリ管理: 不要なアセットを適切に解放
  • 柔軟なアセット更新: リモートサーバーからの更新やダウンロードが可能
  • 依存関係の自動管理: ビルドプロセスの簡素化

2.2. ステップバイステップチュートリアル(Addressableを使用)

ステップ1: Addressableパッケージの導入

  • Unity Package Managerを開く: メニューから「Window > Package Manager」へ移動します。
  • Addressablesパッケージを検索・インストール: Unity Registryから検索し、最新バージョンを導入してください。

ステップ2: PrefabのAddressable設定

  • Prefabを選択: プロジェクトウィンドウで対象のPrefabを選択します。
  • Addressableにマーク: Inspector上で「Addressable」チェックボックスをオンにし、適切なアドレス(例:"MyAddressablePrefab")を設定します。

ステップ3: Addressableスクリプトの作成

  • 新規C#スクリプト作成: 「AddressableSpawner.cs」という名前で作成します。
  • 以下のコードを貼り付けます:
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class AddressableSpawner : MonoBehaviour
{
    // InspectorからPrefabのアドレスを設定
    public string prefabAddress;

    void Start()
    {
        // 非同期でPrefabをロード
        Addressables.LoadAssetAsync<GameObject>(prefabAddress).Completed += OnLoadDone;
    }

    private void OnLoadDone(AsyncOperationHandle<GameObject> handle)
    {
        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            // ロード成功したらPrefabを生成
            Instantiate(handle.Result, Vector3.zero, Quaternion.identity);
        }
        else
        {
            Debug.LogError("Prefabのロードに失敗しました");
        }
    }
}

ステップ4: スクリプトの適用と動作確認

  • シーン内に空のGameObjectを作成: 「AddressableSpawner」などの名前を付けます。
  • 作成したAddressableSpawnerスクリプトをアタッチ。
  • InspectorからprefabAddressフィールドに、設定したアドレス(例:"MyAddressablePrefab")を入力。
  • シーンを再生: 非同期にPrefabがロードされ、指定の位置に生成されることを確認してください。

Addressablesとして設定されたプレハブは、通常のプレハブ(Inspectorで直接参照されるものやResourcesフォルダ内にあるもの)といくつかの点で扱いが異なります。

主な違い

  • ロード方法
    • 通常のプレハブ:
      インスペクターで直接参照し、Instantiateを使って同期的に生成します。
    • Addressablesの場合:
      Addressables.LoadAssetAsync<T>()などの非同期APIを使用してロードします。これにより、バックグラウンドでのロードが可能となり、ロード完了後にインスタンス化する流れになります。
  • アセット管理と依存関係の解決
    • 通常のプレハブ:
      依存関係の管理は、ビルド時や参照関係に依存します。
    • Addressablesの場合:
      Addressablesシステムが、アセットの依存関係を自動で解決・管理し、不要なアセットはリリースすることでメモリ管理もサポートします。必要に応じて、アセットをリモートから更新することも可能です。
  • ビルドプロセスとパフォーマンス
    • 通常のプレハブ:
      シーンに直接含まれるため、ビルドに含める設定はシンプルです。
    • Addressablesの場合:
      アドレス設定やビルド設定を行うことで、複数のグループに分けた管理が可能となります。なお、エディターの「Play Mode Script」で「Use Asset Database (fast mode)」を利用すれば、実際のビルド工程を省略して動作確認できる場合もあります。

まとめ

Addressablesとして設定したプレハブは、非同期ロード、依存関係の自動管理、メモリ管理の面で通常のプレハブとは異なる扱いとなります。そのため、動的なアセット更新や大規模プロジェクトではAddressablesの採用が有効ですが、シンプルな構成であれば従来の方法でも十分な場合があります。プロジェクトの要件に合わせた選択が重要です。


3. まとめ

  • Prefab生成:
    • シンプルなケースでは、InstantiateResources.Loadで十分に対応可能です。
    • 手順を理解するために、まずはPrefabの作成と基本的なスクリプトによる生成から始めましょう。
  • Addressable活用:
    • プロジェクトが大規模になり、アセット管理や非同期ロードが必要な場合に有効です。
    • Package Managerからの導入、PrefabのAddressable設定、そして非同期ロード用スクリプトの実装といった一連の流れを理解することが大切です。

この資料を基に、各チュートリアルを実際に試してみることで、Unityプロジェクト内での動的オブジェクト生成と効率的なアセット管理について深く理解できるでしょう。

Addressable,Prefab,Unity

Posted by hidepon