프로그래밍/유니티 및 C#

[유니티/C#] 여러 개의 오브젝트 풀링 구현하기 (Dictionary 사용)

바토파 2024. 1. 30. 20:23
반응형

던전에 사용할 총알을 오브젝트 풀링으로 구현하였다.

플레이어 총알과 몬스터 총알을 나누기 위해 만들었다.

SerializeField인 ObjectPoolingPrefabs에 총알 프리팹을 넣어주면 프리팹 이름을 통해 오브젝트를 분류한다.

나는 싱글톤으로 DungeonManager를 생성해 그 안에 이 코드를 넣어주었다.

Awake나 Start에 InitializeObject 함수를 넣어줘야 한다.

[SerializeField]
private GameObject[] ObjectPoolingPrefabs;
private Dictionary<string, GameObject> poolingObjectPrefabs = new Dictionary<string, GameObject>();

private Dictionary<string, Queue<GameObject>> poolingObjectQueues = new Dictionary<string, Queue<GameObject>>();

private void InitializeObject(int initCount)
{
    for (int i = 0; i < ObjectPoolingPrefabs.Length; i++)
    {
        poolingObjectPrefabs.Add(ObjectPoolingPrefabs[i].name, ObjectPoolingPrefabs[i]);
        poolingObjectQueues.Add(ObjectPoolingPrefabs[i].name, new Queue<GameObject>());

        for (int j = 0; j < initCount; j++)
        {
            poolingObjectQueues[ObjectPoolingPrefabs[i].name].Enqueue(CreateNewObject(ObjectPoolingPrefabs[i].name));
        }
    }
}

private GameObject CreateNewObject(string objectName) { 
    var newObj = Instantiate(poolingObjectPrefabs[objectName], transform, true);
    newObj.gameObject.SetActive(false);
    return newObj;
}

public GameObject GetObject(string objectName)
{
    if (instance.poolingObjectQueues[objectName].Count > 0)
    {
        var obj = instance.poolingObjectQueues[objectName].Dequeue();
        obj.transform.SetParent(null);
        obj.gameObject.SetActive(true);
        return obj;
    }
    else
    {
        var newObj = instance.CreateNewObject(objectName);
        newObj.gameObject.SetActive(true);
        newObj.transform.SetParent(null);
        return newObj;
    }
}

public void ReturnObject(string objectName, GameObject obj)
{
    obj.gameObject.SetActive(false);
    obj.transform.SetParent(instance.transform);
    instance.poolingObjectQueues[objectName].Enqueue(obj);
}


생성한 오브젝트는 

GameObject bullet = DungeonManager.instance.GetObject("MonsterBullet");

이런 식으로 가져와 사용하면 된다.

 

오브젝트 사용이 끝났으면

DungeonManager.instance.ReturnObject(poolingObjectName, gameObject);

이렇게 오브젝트를 돌려보낸다.

이때 인수로 들어가는 poolingObjectName은 총알을 초기화할 때(GetObject로 총알을 가져왔을 때) 총알 안에 저장해두도록 한다.

반응형