2014년 4월 24일 목요일

Unity2D_ Generic Object Pool Class v1.2


Summary.
기존의 Object Pooling을 사용하기위해 사용하던것을 Generic Class화 하여 봤습니다.
코드의 문제가 군데군데 보이지만 이후 조금씩 보완해 나가겠습니다.

Pool.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Pool<T> : MonoBehaviour where T : MonoBehaviour {

    public GameObject _PoolObject;
    public int _PoolLength;

    private int mPoolLength;
    private List<T> mPoolList;
    private int? mIndex = null;

    void Awake()
    {
        Initialize(_PoolLength);
    }


    private void Initialize(int length)
    {
        mPoolLength = length;
        mPoolList = new List<T>();
        for (int i = 0; i < mPoolLength; ++i)
        {
            GameObject tmp = Instantiate(_PoolObject) as GameObject;
            tmp.transform.parent = transform;
            tmp.name = typeof(T).ToString() + i;
            mPoolList.Add(tmp.GetComponent<T>());
        }
    }

    public T _GetObject
    {
        get 
        {
            if (mIndex == null)
                mIndex = 0;
            else
                mIndex++;

            return mPoolList[(int)mIndex];
        }
    }

    public int? _Index
    {
        get { return mIndex; }
        set { mIndex = value; }
    }

 public List<T> _PoolList
    {
        get { return mPoolList; }
        set { mPoolList = value; }
    }

    public int Length
    {
        get { return mPoolLength; }
    }
}

How to Use.

Enemy.cs
using UnityEngine;
using System.Collections;

public class Enemy : MonoBehaviour
{
    public void Spawn(Vector2 pos)
    {
        Debug.Log("Spawn : " + name + "pos :" + pos);
    }
    public void Die()
    {
        Debug.Log("Die : " + name);
    }
}
EnemyPool.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class EnemyPool : Pool<Enemy>
{
    public void AllEnemySpawn()
    {
        foreach (Enemy ene in _PoolList)
            ene.Spawn(Vector2.zero);
        _Scope = 0;
    }

    public void AllEnemyDie()
    {
        foreach (Enemy ene in _PoolList)
            ene.Die();
        _Scope = 0;
    }

    public void EnemySpwan(Vector2 pos)
    {
        _GetObject.Spawn(pos);
    }

    public void EnemySpawn()
    {
        _GetObject.Spawn(Vector2.zero);
    }

    public void EnemyDie(Enemy target)
    {
        _PoolList.Find(
            delegate(Enemy enemy)
            {
                if (enemy == target)
                {
                    enemy.Die();
                    return true;
                }
                else return false;
            }
            );
    }
}
fix-
v1.0 - 첫 업데이트. 기본적인 Object Pool 구조 작성.
v1.1 - value name modify
v1.2 - method name modify

Categories: ,

0 개의 댓글:

댓글 쓰기