GameObject Pool

°ÔÀÓ Ç÷¹ÀÌ Áß¿¡ GameObject¸¦ ÀÚÁÖ ¾÷µ¥ÀÌÆ® ÇÏ¸é °ÔÀÓ ÁøÇàÁß ·Îµù ºÎÇÏ·Î ÀÎÇØ ²÷¾îÁö´Â ´À³¦ÀÌ ³¯°ÍÀÌ´Ù.

°ÔÀÓ ¿ÀºêÁ§Æ® ¸®¼Ò½º¸¦ ¹Ì¸® ·ÎµùÇÏ¿© »ý¼ºÈÄ »ç¿ë ¹× ¹ÝȯÇÏ¸é ·Îµù ¹× »ý¼º ºÎÇϸ¦ ¸·À»¼ö ÀÖ´Ù.
ÀÌ·± ±â´ÉÀ» ÇÏ´Â °ÍÀ» GameObject PoolÀ̶ó°í ÇÑ´Ù.

ÂüÁ¶ »çÀÌÆ®ÀÇ ¼Ò½º¸¦ ¼öÁ¤ÇÏ¿´´Ù.

SigletonMonoBehaiour.cs : ½Ì±ÛÅæ Á¦³×¸¯ Ŭ·¡½º
ObjectPoolManager.cs : °ÔÀÓ¿ÀºêÁ¦Æ®¸¦ °ü¸®Çϴ Ŭ·¡½º

< GameObject Pool È帧 >
°ÔÀÓ¿ÀºêÁ§Æ® Ç®À» °£·«ÇÏ°Ô ¼³¸íÇÏÀÚ¸é ´ÙÀ½°ú °°´Ù.

1. GameObject PoolÀÇ ÇÁ¸®ÆÕ ÆÄÀÏÀ» ·ÎµùÇÑ´Ù.
ÇÁ¸®ÆÕ ÆÄÀÏÀ» ÇÁ¸®ÆÕ ¼Ò½º¶ó Ī ÇÒ°ÍÀÌ´Ù.

2. ·ÎµùµÈ ÇÁ¸®ÆÕ ÆÄÀÏ·Î °ÔÀÓ¿ÀºêÁ§Æ®¸¦ ÁöÁ¤ÇÑ °¹¼ö¸¸Å­ »ý¼ºÇÑ´Ù.
»ý¼ºµÈ ¿ÀºêÁ§Æ®¸¦ ÇÁ¸®ÆÕ ÀνºÅϽº¶ó Ī ÇÒ°ÍÀÌ´Ù.

3. Pool¿¡ ¹Ì¸® »ý¼ºµÈ °ÔÀÓ¿ÀºêÁ§Æ®¸¦ °¡Á®¿Í¼­ »ç¿ëÇÑ´Ù.
»ç¿ëÀÌ ³¡³­ °ÔÀÓ¿ÀºêÁ§Æ®´Â Pool¿¡ ¹Ýȯ ÇÑ´Ù.

< ObjectPoolManager ¼³Á¤ >

1. ºó GameObject ¸¸µç´Ù.
°ÔÀÓ¿ÀºêÁ§Æ® À̸§Àº ÀÓÀÇÀÇ À̸§À¸·Î ¿©±â¼­´Â GameObjectPool·Î ÇÑ´Ù.

2. ObjectPoolManager.cs¸¦ GameObjectPoolÀÇ ÄÄÆ÷³ÍÆ®·Î Ãß°¡ÇÑ´Ù.

3. Inspector â¿¡¼­ ÇÁ¸®·Îµù ÇÒ GameObject¸¦ ¼³Á¤ÇÑ´Ù.
mPreloadInfoÀÇ Å©±â¸¦ ¼³Á¤ÇÑ´Ù.
prefab :  GameObject ÇÁ¸®ÆÕ ¼³Á¤
count : GameObject °³¼ö ¼³Á¤
mIsNewAdd : trueÀ̸é count º¸´Ù ¸¹Àº °ÔÀÓ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÑ´Ù.
                   falseÀ̸é count ¸¸Å­ÀÇ °ÔÀÓ¿ÀºêÁ§Æ®¸¸ »ý¼ºÇÑ´Ù.

 

< ObjectPoolManager ½ºÅ©¸³Æ® »ç¿ë >

GameObject [] mGameObject = new GameObject[4];

 

void TestPool()

{

    //ObjectPoolManager.Instance.UnloadPrefab("Cylinder");

 

    Transform _t0 = transform;

    _t0.position = new Vector3( 20, 0, 0);

    mGameObject[0] = ObjectPoolManager.Instance.Create("Cylinder", _t0.position, _t0.rotation);

 

    Transform _t1 = transform;

    _t1.position = new Vector3( 25, 0, 0);

    mGameObject[1] = ObjectPoolManager.Instance.Create("Cylinder", _t1.position, _t1.rotation);

 

    Transform _t2 = transform;

    _t2.position = new Vector3( 30, 0, 0);

    mGameObject[2] = ObjectPoolManager.Instance.Create("Cylinder", _t2.position, _t2.rotation);

 

    if(mGameObject[2])

        ObjectPoolManager.Instance.Release(mGameObject[2]);

 

    mGameObject[3] = ObjectPoolManager.Instance.Create("Cylinder");

    if(mGameObject[3] == null)

    {

        Debug.Log("Cylinder NULL");

    }

}

¸®¼Ò½º ÇÁ¸®ÆÕ ¼Ò½º¸¦ ¾ð·Îµù ÇÑ´Ù. Ưº°ÇÑ °æ¿ì°¡ ¾Æ´Ï¸é ÀÌ ¸Þ¼Òµå¸¦ ½ÇÇàÇÒ ÀÏÀº ¾øÀ» °ÍÀÌ´Ù.
ObjectPoolManager.Instance.UnloadPrefab("Cylinder")

Ç®¿¡¼­ °ÔÀÓ¿ÀºêÁ§Æ®¸¦ ¾ò¾î¿Â´Ù.
ObjectPoolManager.Instance.Create("Cylinder", _t0.position, _t0.rotation)
ObjectPoolManager.Instance.Create("Cylinder")

Ç®¿¡¼­ ¾ò¾î¿Â °ÔÀÓ¿ÀºêÁ§Æ®¸¦ µ¹·ÁÁØ´Ù.
ObjectPoolManager.Instance.Release(mGameObject[2])

½ºÅ©¸³Æ®¿¡¼­´Â ObjectPoolManagerÀÇ Create( )¿Í Release( )¸¸ ÁÖ·Î »ç¿ëÇÏ°Ô µÉ°ÍÀÌ´Ù.

< ¼Ò½º ¼³¸í >

¼Ò½º :
SigletonMonoBehaiour.cs : ½Ì±ÛÅæ Á¦³×¸¯ Ŭ·¡½º
ObjectPoolManager.cs : °ÔÀÓ¿ÀºêÁ¦Æ®¸¦ °ü¸®Çϴ Ŭ·¡½º

ObjectPoolManager.cs¿¡´Â 4°³ÀÇ Å¬·¡½º°¡ ÀÖ´Ù.

ObjectPool : ÇÑ °³ÀÇ ÇÁ¸®ÆÕ ¼Ò½º¿Í ÁöÁ¤ÇÑ °³¼öÀÇ °ÔÀÓ¿ÀºêÁ§Æ®ÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÏ¿© À¯ÁöÇÑ´Ù.

ObjectPoolManager : ObjectPoolÀ» °ü¸®ÇÑ´Ù.

PreloadObjectInfo : ¹Ì¸®·ÎµùÀ» ¿øÇÏ´Â ÇÁ¸®ÆÕ ¼Ò½º¿Í °³¼ö¸¦ ³ªÅ¸³½´Ù.

PreloadFileInfo : ¹Ì¸®·ÎµùÀ» ¿øÇÏ´Â ÇÁ¸®ÆÕ ¼Ò½º ÆÄÀÏÀ̸§°ú °³¼ö¸¦ ³ªÅ¸³½´Ù.

ObjectPoolManager ÁÖ¿ä ÇÔ¼öµé

- Awake : ½ÃÀ۽ÿ¡ È£ÃâµÇ´Â ÇÔ¼ö
mPreloadInfo ¹è¿­ÀÇ °ªÀ¸·Î PreloadPrefab( ) ½ÇÇà

- OnApplicationQuit : Á¾·á½Ã¿¡ È£ÃâµÇ´Â ÇÔ¼ö

-  PreloadPrefab(PreloadObjectInfo [] infoArr) :
PreloadObjectInfoÀÇ ¹è¿­·Î °ÔÀÓ¿ÀºêÁ§Æ® ÇÁ¸®ÆÕ, ÀνºÅϽºµéÀ» ¹Ì¸® ·Îµù ¹× »ý¼ºÇÑ´Ù.

- PreloadPrefab(PreloadFileInfo [] infoArr)
PreloadFileInfoÀÇ ¹è¿­·Î °ÔÀÓ¿ÀºêÁ§Æ® ÇÁ¸®ÆÕ, ÀνºÅϽºµéÀ» ¹Ì¸® ·Îµù ¹× »ý¼ºÇÑ´Ù.

- GameObject Create(string prefabPath)
  GameObject Create(string prefabPath, Vector3 position, Quaternion rotation)
°ÔÀÓ ¿ÀºêÁ§Æ®¸¦ ¾ò¾î¿Â´Ù.

- Release(GameObject prefab)
  Release(string prefabPath, GameObject prefab)
°ÔÀÓ ¿ÀºêÁ§Æ®¸¦ ¹ÝȯÇÑ´Ù.

- UnloadPrefab(string prefabPath)
ÇÁ¸®ÆÕ ¼Ò½º¸¦ ¾ð·ÎµùÇÑ´Ù. Ư¼öÇÑ °æ¿ì°¡ ¾Æ´Ï¸é »ç¿ëÇÒ ÀÏÀÌ ¾øÀ½

- GetSourcePrefab(string prefabPath, bool isLoad)
ÇÁ¸®ÆÕ ¼Ò½ºÀÇ °ÔÀÓ ¿ÀºêÁ§Æ®¸¦ ±¸ÇÑ´Ù. ¾ÆÁ÷ ·ÎµùÀÌ ¾ÈµÇ¾ú´Ù¸é ·ÎµùÇÑ´Ù.
isLoad°¡ falseÀÌ¸é ·Îµù ¾øÀÌ ÇÁ¸®ÆÕ °ÔÀÓ ¿ÀºêÁ§Æ®¸¸ ±¸ÇÑ´Ù.

ObjectPoolÀÇ ÁÖ¿ä ÇÔ¼öµé

- Create
°ÔÀÓ ¿ÀºêÁ§Æ® ÀνºÅϽº¸¦ ¾ò¾î¿Â´Ù.

- Release(GameObject instance)
°ÔÀÓ ¿ÀºêÁ§Æ® ÀνºÅϽº¸¦ ¹ÝȯÇÑ´Ù.

- ObjectPool
  ObjectPool(string prefabPath)
  ObjectPool(GameObject sourcePrefab)
»ý¼ºÀÚ¿¡¼­ ÇÁ¸³ÆÕ ¼Ò½º¸¦ ·ÎµùÇÑ´Ù.

- Add(GameObject instance)
°ÔÀÓ ¿ÀºêÁ§Æ® ÀνºÅϽº¸¦ Ãß°¡ÇÑ´Ù.

- Destroy()
ObjectPoolÀÇ Á¤º¸¸¦ Á¦°ÅÇÑ´Ù.

ÂüÁ¶)
http://ooo-qm-ooo.cocolog-nifty.com/blog/2013/07/unityprefabpool.html