오브젝트 풀링 만들려고 구조 잡는중에
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>를 컴포넌트 및 오브젝트화해서 사용하지 못한다.
즉, 제네릭 클래스 그 자체로는 사용하지 못하고 상속을 해서 사용해야 올바른 사용법이다.
'Unity' 카테고리의 다른 글
Unity :: Rigidbody컴포넌트의 Rigidbody.AddForce() , ForceMode (0) | 2024.10.24 |
---|---|
Unity :: UnityEngine에서 제공하는 Pool 패키지(오브젝트 풀) (0) | 2024.10.23 |
Unity :: TMP(Text Mesh Pro) 한글 폰트로 쓰기 , 스크립트에서 사용하기 (0) | 2024.10.15 |
Unity :: 비트연산자와 레이어마스크 (0) | 2024.10.14 |
Unity :: StringToHash 메서드 사용하기(애니메이터 컨트롤러) (0) | 2024.10.14 |