Unity
Unity :: (2024.10.21수정)제네릭 클래스를 상속받은 Class는 오브젝트 생성 및 컴포넌트로 사용 할수 잇지만 제네릭 클래스 그 자체는 사용 할 수 없다.
BirdHead
2024. 10. 21. 15:21
오브젝트 풀링 만들려고 구조 잡는중에
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>를 컴포넌트 및 오브젝트화해서 사용하지 못한다.
즉, 제네릭 클래스 그 자체로는 사용하지 못하고 상속을 해서 사용해야 올바른 사용법이다.