对象池应用

来源:互联网 发布:苍云脸型数据 编辑:程序博客网 时间:2024/06/03 20:55
usingUnityEngine;
usingSystem.Collections.Generic;
usingSystem.Text;
publicenumEnemyType
{
    FirstEnemy,
    SecnodEnemy,
    ThereEnemy,
    FourEnemy,
    FiveEnemy,
}
publicclassObjectPool:Singleton<ObjectPool> {
   //敌人池
   private Dictionary<string,List<GameObject>> mPools;
   GameObject_result =null;
   #regionsingleton
   publicObjectPool()
    {
        mPools =newDictionary<string,List<GameObject>>();
     
    }
   #endregion
   publicGameObjectSwpanObject(EnemyTypetype,Vector3pos,Quaternionrotation)
    {
       //key 是集合的主键
        _result =null;
       string_key = CreatEnemy(type).name.Replace("(Clone)","");
       //
       if(mPools.ContainsKey(_key))
        {
           if(mPools[_key].Count > 0)
            {
                 _result = mPools[_key][0];
                mPools[_key].Remove(_result);
               if(_result)
                {
                    _result.SetActive(true);
                    _result.transform.position = pos;
                    _result.transform.rotation = rotation;
                   return_result;
                }
            }
        }
           //创建一个对象
           GameObject_res =GameObject.Instantiate(CreatEnemy(type), pos, rotation)asGameObject;
           return_res;
    }
   publicGameObjectSwpanObject(GameObjecttype,Vector3pos,Quaternionrotation)
    {
       //key 是集合的主键
        _result =null;
       string_key = type.tag;
       //
       if(mPools.ContainsKey(_key))
        {
           if(mPools[_key].Count > 0)
            {
                _result = mPools[_key][0];
                mPools[_key].Remove(_result);
               if(_result)
                {
                    _result.SetActive(true);
                    _result.transform.position = pos;
                    _result.transform.rotation = rotation;
                   return_result;
                }
            }
        }
       //创建一个对象
       GameObject_res =GameObject.Instantiate(type, pos, rotation)asGameObject;
       return_res;
    }
   publicGameObjectCreatEnemy(EnemyTypetype) {
       StringBuilderpath =newStringBuilder();
       switch(type)
        {
           caseEnemyType.FirstEnemy:
                path.Append("Enemy/FirstEnemy");
               break;
           caseEnemyType.SecnodEnemy:
                path.Append("Enemy/SecondEnemy");
               break;
           caseEnemyType.ThereEnemy:
                path.Append("Enemy/ThereEnemy");
               break;
           caseEnemyType.FourEnemy:
                path.Append("Enemy/FourEnemy");
               break;
           default:
               break;
        }
       GameObjectobj =Resources.Load(path.ToString())asGameObject;
       returnobj;
    }
   publicvoidDestoryObject(GameObjectgameObject)
    {
        gameObject.SetActive(false);
       string_key = gameObject.name.Replace("(Clone)","");
       //如果没有这个类型的集合
       if(!mPools.ContainsKey(_key))
        {
            mPools.Add(_key,newList<GameObject>());
        }
        mPools[_key].Add(gameObject);
    //   Debug.Log("死亡");
    //  Destory(_key);
    }
   ///<summary>
   ///死的怪物才会放池子里
   ///</summary>
   ///<param name="name"></param>
   privatevoidDestory(stringname)
    {
       List<GameObject> _pool = new List<GameObject>();
       if(Instance.mPools.Count > 0)
        {
            _pool = Instance.mPools[name];
        }
       if(_pool.Count > 3)
        {
           for(inti = 2; i > 0; i--)
            {
               GameObject.Destroy(_pool[i]);
                _pool.Remove(_pool[i]);
                mPools[name].Remove(mPools[name][i]);
            }
        }
    }
}
-----------------------------------------------------------
运用
 publicvoidCreatEnemy(EnemyTypetype,Transformtarget) {
        mEnemy =ObjectPool.Instance.SwpanObject(type,transform.position,Quaternion.identity);
       //这句话必须有 否则报错
       if(mEnemy==null)
        {
            mEnemy =ObjectPool.Instance.CreatEnemy(type);
            mEnemy =ObjectPool.Instance.SwpanObject(mEnemy, transform.position,Quaternion.identity);
        }
     //  mEnemy.GetComponent<CharBase>().mTarTrans = target;
        initLife = mEnemy;
    }