Unity でのオブジェクト プーリングの実装

オブジェクト プーリングは、ゲーム開発でゲーム オブジェクトを効率的に管理および再利用するために使用される設計パターンです。 Unity では、オブジェクトのインスタンス化と破棄が頻繁に行われると、メモリ割り当てとガベージ コレクションが原因でパフォーマンスの問題が発生する可能性があります。オブジェクト プーリングは、その場でオブジェクトを作成して破棄するのではなく、ゲームの開始時に事前定義された数のオブジェクトを事前にインスタンス化し、必要に応じて再利用することでこの問題に対処します。

このチュートリアルでは、C# を使用して Unity にオブジェクト プーリングを実装する方法を説明します。プールされて再利用される発射体を使用した簡単な例を作成します。

ステップ 1: プロジェクトのセットアップ

  1. 新しい Unity プロジェクトを作成するか、既存のプロジェクトを開きます。
  2. シーン内に空のゲームオブジェクトを作成し、オブジェクト プールのマネージャーとして機能させます。

ステップ 2: オブジェクト プーリング スクリプトの作成

using System.Collections.Generic;
using UnityEngine;

public class ObjectPooler : MonoBehaviour
{
    public static ObjectPooler Instance;

    public GameObject pooledObject;
    public int pooledAmount = 20;
    List pooledObjects;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        pooledObjects = new List();
        for (int i = 0; i < pooledAmount; i++)
        {
            GameObject obj = Instantiate(pooledObject);
            obj.SetActive(false);
            pooledObjects.Add(obj);
        }
    }

    public GameObject GetPooledObject()
    {
        for (int i = 0; i < pooledObjects.Count; i++)
        {
            if (!pooledObjects[i].activeInHierarchy)
            {
                return pooledObjects[i];
            }
        }

        return null;
    }
}

ステップ 3: プールするオブジェクトの作成

プールするオブジェクトのプレハブを作成します。この例では、単純な発射体を作成してみましょう。

  1. 新しいゲームオブジェクトを作成し、"Projectile" という名前を付けます。
  2. に Rigidbody コンポーネントをアタッチして、物理的な相互作用を可能にします。
  3. 必要に応じて、衝突を検出するために Collider コンポーネントをアタッチします。
  4. GameObject を Assets フォルダーにドラッグして、プレハブを作成します。

ステップ 4: オブジェクト プーラーの使用

using UnityEngine;

public class ProjectileSpawner : MonoBehaviour
{
    public float fireRate = 0.5f;
    float nextFire = 0.0f;

    void Update()
    {
        if (Input.GetButtonDown("Fire1") && Time.time > nextFire)
        {
            nextFire = Time.time + fireRate;
            SpawnProjectile();
        }
    }

    void SpawnProjectile()
    {
        GameObject projectile = ObjectPooler.Instance.GetPooledObject();

        if (projectile != null)
        {
            projectile.transform.position = transform.position;
            projectile.transform.rotation = transform.rotation;
            projectile.SetActive(true);
        }
    }
}

ステップ 5: テスト

  1. 'ProjectileSpawner' スクリプトをシーン内の任意のゲームオブジェクトにアタッチします。
  2. Projectile プレハブをマネージャー ゲームオブジェクトの 'ObjectPooler' コンポーネントの 'pooledObject' フィールドに割り当てます。
  3. ゲームを実行し、発射ボタン ("Fire1" を想定) を押して発射物を生成します。

結論

オブジェクト プーリングは、ゲーム開発、特に Unity において不可欠な最適化手法です。オブジェクトを繰り返しインスタンス化して破棄するのではなく、オブジェクトを再利用することで、ゲームのパフォーマンスと効率を向上させることができます。このチュートリアルでは、C# を使用した簡単な例を使用して、Unity にオブジェクト プーリングを実装する方法を学習しました。

おすすめの記事
Unity の GUILayout の概要
Unity でのタイマーの実装
Unity でオブジェクトをマウス カーソルに追従させる方法
Poppy Playtime からインスピレーションを得て Unity で GrabPack を作成する
Unity でバレットタイムエフェクトを作成する
Unity でインタラクティブなオブジェクトを作成する
Unity でのキネティック インタラクションの実装