유니티 C# 제네릭 클래스 코드 재사용 간단 구현

반응형

코드 작성

using System.Collections.Generic;
using UnityEngine;

// 제네릭 풀 클래스
public class ObjectPool<T> where T : MonoBehaviour
{
    private List<T> pool = new List<T>();
    private T prefab;

    public ObjectPool(T prefab, int initialSize)
    {
        this.prefab = prefab;
        for (int i = 0; i < initialSize; i++)
        {
            AddObjectToPool();
        }
    }

    private T AddObjectToPool()
    {
        T newObj = GameObject.Instantiate(prefab);
        newObj.gameObject.SetActive(false);
        pool.Add(newObj);
        return newObj;
    }

    public T GetObjectFromPool()
    {
        foreach (T obj in pool)
        {
            if (!obj.gameObject.activeInHierarchy)
            {
                obj.gameObject.SetActive(true);
                return obj;
            }
        }

        // 풀에 사용 가능한 오브젝트가 없으면 새로 생성
        return AddObjectToPool();
    }

    public void ReturnObjectToPool(T obj)
    {
        obj.gameObject.SetActive(false);
    }
}

// 사용 예시
public class GameManager : MonoBehaviour
{
    public Enemy enemyPrefab; // 적 오브젝트 프리팹
    public Bullet bulletPrefab; // 총알 오브젝트 프리팹

    private ObjectPool<Enemy> enemyPool;
    private ObjectPool<Bullet> bulletPool;

    void Start()
    {
        // 각각의 풀 생성
        enemyPool = new ObjectPool<Enemy>(enemyPrefab, 10);
        bulletPool = new ObjectPool<Bullet>(bulletPrefab, 20);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // 적 오브젝트 풀에서 오브젝트 가져오기
            Enemy enemy = enemyPool.GetObjectFromPool();
            enemy.transform.position = Vector3.zero; // 예: 초기화
        }

        if (Input.GetKeyDown(KeyCode.B))
        {
            // 총알 오브젝트 풀에서 오브젝트 가져오기
            Bullet bullet = bulletPool.GetObjectFromPool();
            bullet.transform.position = Vector3.zero; // 예: 초기화
        }
    }
}

// 간단한 적 클래스
public class Enemy : MonoBehaviour
{
    // 적 오브젝트의 로직
}

// 간단한 총알 클래스
public class Bullet : MonoBehaviour
{
    // 총알 오브젝트의 로직
}
반응형