오브젝트 풀링 만들려고 구조 잡는중에 
ObjectPool을 제네릭으로 만들고 게임오브젝트 생성하듯이 하려고했으나
자꾸 null값을 반환하여 왜그런지 찾아보니 
제네릭 클래스는 컴포넌트화하지 못한다 , 즉, 오브젝트로 못만든다는 뜻이다.
그래서 Monobehaviour를 해지하고 C#문법을 이용하여 Class를 호출하여 사용하여아한다. 

 

public class ObjectPool<T> : MonoBehaviour where T : Component
{
    public Queue<T> PoolQueue;

    public void Start()
    {
        PoolQueue = new Queue<T>();
    }

    public void Initailize(int poolCount, T poolObject)
    {
        GameObject poolContainer = new GameObject("Pool_Container_" + poolObject.name);

        T gameObj;
        for (int i = 0; i < poolCount; i++)
        {
            gameObj = Instantiate(poolObject, poolContainer.transform);
            gameObj.gameObject.SetActive(false);

            PoolQueue.Enqueue(gameObj);
        }
    }
}

 /*====================================================================*/

public class EnemySpawnManager : SpawnManager<TestMonster>
{
  
  private void Start()
    {
        foreach (TestMonster prefab in prefabesList)
        {
            prefab.OnEventPushObject += PushObject;
			
            //트러블슈팅이 난구간 objectPool을 자꾸 null을 반환한다.
            ObjectPool<TestMonster> objectPool = new ObjectPool<TestMonster>();
            
            objectPool.Initailize(prefab.PoolCount, prefab);
            objectPools.Add(prefab.name, objectPool);
        }

        Initialize();
    }
}

 

해당 오브젝트의 objectPool을 받아오려 했으나 자꾸 null을 반환해서 문제가 발생하였다.

 

//트러블슈팅 대처 : Mononehaviour 를 상속해지하였음 
public class ObjectPool<T> where T : MonoBehaviour
{
    public Queue<T> PoolQueue = new Queue<T>();
    
    public Queue<T> PoolQueue = new Queue<T>();
	
    //Initialize 메서드를 변경하였음 (트러블슈팅과 문제되는부분 x)
    public bool InitPushObject(T poolObject)
    {
        if (poolObject == null) 
        {
            Debug.Log(poolObject.name + "이 null 입니다.");
            return false;
        }

        poolObject.gameObject.SetActive(false);
        PoolQueue.Enqueue(poolObject);

        return true;
    }
}

/*===========================================================*/

public class EnemySpawnManager : SpawnManager<TestMonster>
{
	private void Awake()
	{
    	TestMonster gameObj;

        foreach (TestMonster prefab in prefabesList)
        {
            GameObject poolContainer = new GameObject("Pool_Container_" + prefab.name);
			
            //트러블슈팅 대처 : 
            //Monobehaviour를 상속해지해서 new 어트리뷰트를 이용해여 클래스 객체 생성을 함
            ObjectPool<TestMonster> objectPool = new ObjectPool<TestMonster>();

            for (int i = 0; i < prefab.PoolCount; i++)
            {
                gameObj = Instantiate(prefab, poolContainer.transform);
                gameObj.OnEventPushObject += PushObject;
                objectPool.InitPushObject(gameObj);
            }

            objectPools.Add(prefab.monsterName, objectPool);
        }

    	Initialize();
	}
}

ObjectPool의 Monobehaviour를 상속해지하고 C# 문법의 new로 객체를 생성한뒤 호출하여 사용하였다.

=============================2024.10.21 수정=============================================

 

제네릭을 상속 받은 클래스들 -> EnemySpawnManager는 이미 오브젝트로 만들어 진다.

하지만 ObjectPool<T>를 컴포넌트 및 오브젝트화해서 사용하지 못한다.

즉, 제네릭 클래스 그 자체로는 사용하지 못하고 상속을 해서 사용해야 올바른 사용법이다.

 

+ Recent posts