簡單對象池的實現(xiàn)(多種GameObject)

之前做的一個項目歇由,需要很頻繁的生成多種不同模型,所以我就把之前單一對象池修改了下,可以使用多種GameObject~~反砌。 廢話不多說猎拨,上代碼?

ObjectPool類

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class ObjectPool

{

private ListdespawnedTrans;

public AnimalTransformInfo origianTran;

public Transform prefab;

public Transform root;

public int curTranCount = 0;

public int TranCount

{

get

{

return curTranCount;

}

}

public ObjectPool(Transform _prefab, Transform _root)? ??

{? ? ? ?

?despawnedTrans = new List();

origianTran = new AnimalTransformInfo();

prefab = _prefab;

root = _root;

prefab.SetParent(root);

prefab.gameObject.SetActive(false);

}

public int DespawnedCout

{

get

{

return despawnedTrans.Count;

}

}

////// 從池中取出一個對象

//////

public Transform Spwan()? ? {? ? ? ?

?if(despawnedTrans.Count == 0)? ? ? ? {? ? ? ? ? ?

?CreateInstance();? ? ? ? }? ? ? ??

Transform tran = despawnedTrans[0];? ? ? ??

origianTran.initPos = tran.position;? ? ? ??

origianTran.initRoate = tran.rotation;? ? ? ??

origianTran.initScale = tran.localScale;? ? ? ??

despawnedTrans.RemoveAt(0);? ? ? ??

tran.gameObject.SetActive(true);? ? ? ??

return tran;? ??

}

public void DeSpawn(Transform tran, bool parentChange = true)

{

if(despawnedTrans.Contains(tran))

{

return;

}

if(parentChange)

{

tran.SetParent(root);

}

tran.position = origianTran.initPos;

tran.rotation = origianTran.initRoate;

tran.localScale = origianTran.initScale;

despawnedTrans.Add(tran);

tran.gameObject.SetActive(false);

}

///

/// 創(chuàng)建新的一個對象

///

public void CreateInstance()

{

GameObject obj = GameObject.Instantiate(prefab.gameObject);

obj.transform.SetParent(root);

despawnedTrans.Add(obj.transform);

obj.name = prefab.name;

// obj.name = string.Concat(prefab.name, curTranCount++);? 修改名字

}

///

/// 在池中一次創(chuàng)建多個新的對象

/////

public IEnumerator CreateInstances(int count)

{

for(int i =0;i < count;i++)

{

CreateInstance();

yield return null;

}

}

///

/// 釋放池

///

public void Dispose()

{

curTranCount = 0;

despawnedTrans.ForEach(delegate (Transform tran)

{

if(tran != null)

{

GameObject.Destroy(tran.gameObject);

}

});

if(prefab != null)

{

GameObject.Destroy(prefab.gameObject);

}

despawnedTrans = null;

}

}

接下來是創(chuàng)建不同的池膀藐,使用ItemCreator類

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class ItemCreator {? ??

public DictionarybasePools;? ??

private Transform poolRoot;? ? ??

?public ItemCreator()? ? {? ? ??

? basePools = new Dictionary();

poolRoot = new GameObject("PoolRoot").transform;

MonoBehaviour.DontDestroyOnLoad(poolRoot.gameObject);

}

////

// 創(chuàng)建一個對象池

//////

public void AddPool(GameObject prefabObj)

{

AddPool(prefabObj.name, prefabObj, poolRoot);

}

//創(chuàng)建一個池對象并添加到Dic中

public void AddPool(string prefabName ,GameObject prefabObj ,Transform root)

{

if(basePools.ContainsKey(prefabName))

{

return;

}

ObjectPool prefabPool = new ObjectPool(prefabObj.transform, root);

basePools.Add(prefabName, prefabPool);

}

//從一個池中取出一個對象

public Transform SpawnObjByName(string name )? ? {? ? ??

? if(!basePools.ContainsKey(name))? ? ? ? {? ? ? ? ? ? ? ? ? ? ?

?GameObject newPoolObj = MonoBehaviour.Instantiate(Resources.Load("model/"+name));

newPoolObj.name = name;

AddPool(newPoolObj);

return basePools[name].Spwan();

}

return basePools[name].Spwan();

}

//將對象還給池

public void DeSpawn(string nam, Transform tran, bool parentChange =true)

{

if(!basePools.ContainsKey(nam))

{

return;

}

basePools[nam].DeSpawn(tran,parentChange);

}

到此為止,生成的時候調(diào)用這個管理類來生成就行了红省,釋放也是一樣的~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末额各,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吧恃,更是在濱河造成了極大的恐慌臊泰,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缸逃,居然都是意外死亡针饥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門需频,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丁眼,“玉大人,你說我怎么就攤上這事昭殉“撸” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵挪丢,是天一觀的道長蹂风。 經(jīng)常有香客問我,道長乾蓬,這世上最難降的妖魔是什么惠啄? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮任内,結(jié)果婚禮上撵渡,老公的妹妹穿的比我還像新娘。我一直安慰自己死嗦,他們只是感情好趋距,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著越除,像睡著了一般节腐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摘盆,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天铜跑,我揣著相機與錄音,去河邊找鬼骡澈。 笑死锅纺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的肋殴。 我是一名探鬼主播囤锉,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼护锤!你這毒婦竟也來了官地?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤烙懦,失蹤者是張志新(化名)和其女友劉穎驱入,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡亏较,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年莺褒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雪情。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡遵岩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巡通,到底是詐尸還是另有隱情尘执,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布宴凉,位于F島的核電站誊锭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弥锄。R本人自食惡果不足惜丧靡,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望叉讥。 院中可真熱鬧窘行,春花似錦饥追、人聲如沸图仓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽救崔。三九已至,卻和暖如春捏顺,著一層夾襖步出監(jiān)牢的瞬間六孵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工幅骄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留劫窒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓拆座,卻偏偏與公主長得像主巍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挪凑,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 本節(jié)通過一個簡單的射擊子彈的示例來介紹Transform的用法孕索。子彈射擊本身很容易制作,只要制作一個子彈Prefa...
    OneMore2018閱讀 552評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理躏碳,服務發(fā)現(xiàn)搞旭,斷路器,智...
    卡卡羅2017閱讀 134,693評論 18 139
  • About these tips(Edit: August 2016. I have revised these ...
    Francis_Rose閱讀 547評論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法肄渗,內(nèi)部類的語法镇眷,繼承相關(guān)的語法,異常的語法恳啥,線程的語...
    子非魚_t_閱讀 31,660評論 18 399
  • 看到大家都在走路偏灿,今天(6月8曰)下班后決定也走回去。 既然走路钝的,那就找風景好的路徑翁垂。 沿著龍子湖邊走應該是不錯的...
    禹王山人閱讀 335評論 1 2