오브젝트 풀 구성시 모든 풀을 담당하는 오브젝트에서 자식 오브젝트 모두를 순회하며 Pool 내부에 원하는 개체들을 Initialize 하는 방법에 대해서.

GameManager 혹은 GameBoard 클래스 등에서

    public void InitializeObjectPools()
    {
        foreach (var pool in fruitPool.GetComponentsInChildren<ObjectPool>())
            pool.Initialize();

    }

등과 같이 작성해서 기본적으로 fruitPool (이 경우 FruitPool 스크립트가 부착된 오브젝트) 의 자식들에서 ObjectPool 을 컴포넌트로 가지고 있는 컴포넌트들을 초기화 하는 과정.

이때의 로직을 따라 가보면, ObjectPool 클래스 내에서,

Initialize() 메서드 로직

public void Initialize()
{
    for (var i = 0; i < initialSize; i++)
    {
        var obj = CreateInstance();
        obj.SetActive(false);
        instances.Push(obj);
    }
}

CreateInstance() 메서드 로직

    private GameObject CreateInstance()
    {
        var obj = Instantiate(prefab);
        var pooledObject = obj.AddComponent<PooledObject>();
        pooledObject.pool = this;
        obj.transform.SetParent(transform);
        return obj;
    }

이와 같은 형태로 진행된다.

결국 위와 같은 과정을 거쳐서 오브젝트 풀에 처음 원하는 값으로 설정한 갯수만큼 프리펩을 통해 오브젝트를 만들고 해당 오브젝트들을 SetActive(false) 로 만든뒤에 instances 스택에 Push 해놓는다.

이제 이렇게 초기화 해놓은 것들을 원하는 위치로 가져왔다가 불필요해질 경우에는 다시
RetrunObject() 메서드로 Pool 로 되돌려 놓으면 된다.

이때에 ObjectPool 에 작성된 RetrunObejct() 코드를 첨부하자면,

ReturnObejct()

   public void ReturnObject(GameObject obj)
   {
       var pooledObject = obj.GetComponent<PooledObject>();
       Assert.IsNotNull(pooledObject);
       Assert.IsTrue(pooledObject.pool == this);

       obj.SetActive(false);
       if (!instances.Contains(obj))
       {
           instances.Push(obj);
       }
   }

이와 같다.

이때에 PooledObject의 경우는 ObjectPool 클래스 파일에 함께 작성해놓은 Utility class이다
구조는

public class PooledObject : MonoBehaviour
{
    public ObjectPool pool;
}

이와 같다.

  Comments,     Trackbacks