Unity에서 객체 풀링 구현

개체 풀링은 게임 개체를 효율적으로 관리하고 재사용하기 위해 게임 개발에 사용되는 디자인 패턴입니다. Unity에서 객체를 자주 인스턴스화하고 삭제하면 메모리 할당 및 가비지 수집으로 인해 성능 문제가 발생할 수 있습니다. 개체 풀링은 게임 시작 시 미리 정의된 수의 개체를 미리 인스턴스화한 다음 즉시 개체를 생성하고 파괴하는 대신 필요에 따라 재사용하여 이 문제를 해결합니다.

이 튜토리얼에서는 C#을 사용하여 Unity에서 개체 풀링을 구현하는 과정을 안내합니다. 모아서 재사용하는 발사체를 사용하여 간단한 예를 만들어 보겠습니다.

1단계: 프로젝트 설정

  1. 새 Unity 프로젝트를 만들거나 기존 프로젝트를 엽니다.
  2. 개체 풀의 관리자 역할을 할 빈 GameObject를 장면에 만듭니다.

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. 새 GameObject를 만들고 이름을 "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' 스크립트를 장면의 모든 GameObject에 연결합니다.
  2. 관리자 GameObject의 'ObjectPooler' 구성 요소에 있는 'pooledObject' 필드에 발사체 프리팹을 할당합니다.
  3. 게임을 실행하고 발사 버튼("Fire1"로 가정)을 눌러 발사체를 생성합니다.

결론

개체 풀링은 게임 개발, 특히 Unity에서 필수적인 최적화 기술입니다. 개체를 반복적으로 인스턴스화하고 삭제하는 대신 개체를 재사용하면 게임의 성능과 효율성을 향상시킬 수 있습니다. 이 자습서에서는 C#을 사용한 간단한 예제를 통해 Unity에서 개체 풀링을 구현하는 방법을 배웠습니다.