°ÔÀÓ Ç÷¹ÀÌ Áß¿¡ 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
|