unity對象池

在網(wǎng)上看見了對象池的一些應(yīng)用遏暴,一直很好奇,所以來研究一下

對象池主要的用途就是在那些需要重復(fù)被創(chuàng)建和銷毀的物體上可以不進(jìn)行重復(fù)的創(chuàng)建和銷毀,例如子彈宗收,在射擊時(shí)被創(chuàng)建,一般在打到物體或者飛行一段距離(時(shí)間)后被銷毀亚兄,然后再射擊一次混稽,再重復(fù)此操作,但要知道审胚,多次的創(chuàng)建和銷毀很耗性能匈勋,而對象池可以這樣去處理子彈——在射擊時(shí)先查詢對象池里有沒有沒被激活的子彈,沒有就創(chuàng)建一個(gè)新的膳叨,并把新的子彈加入到對象池洽洁,再把它射擊出去;有就激活舊子彈菲嘴,然后重置其參數(shù)饿自,再把它射擊出去,打到物體或者飛行一段距離(時(shí)間)后不進(jìn)行銷毀而是直接隱藏龄坪,這樣就可以做到重復(fù)利用已創(chuàng)建出來的子彈昭雌,只進(jìn)行激活和隱藏操作,大大節(jié)省了性能

那么具體就見代碼吧悉默,就以子彈為例

現(xiàn)在寫了三個(gè)腳本城豁,一個(gè)是子彈的,主要有子彈的速度抄课,飛行距離唱星,初始位置,移動跟磨,銷毀间聊,碰撞
一個(gè)是武器的,主要有子彈抵拘,子彈射擊出的位置哎榴,創(chuàng)建對應(yīng)類型的子彈的克隆體并加入到對象池中
一個(gè)是對象池的,有一個(gè)存放所有克隆體的字典,以Tag為key尚蝌,有加入字典的方法迎变,又找到某種類型的克隆體的方法,還有一個(gè)重置物體的方法

這樣構(gòu)成了一個(gè)最簡單的子彈對象池

首先是子彈代碼:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

namespace tomo
{
    public class bullet : MonoBehaviour
    {

        // Use this for initialization
        public float speed;
        public float distance;
        private Vector3 start_pos;

        void Awake()
        {
            start_pos = transform.position;
        }
        void Start()
        {

        }

        // Update is called once per frame
        void Update()
        {                     
            Move();            

        }
        
        private void Move()
        {
            transform.GetComponent<Rigidbody>().velocity = Vector3.forward * speed * Time.deltaTime;
            destroy(distance);
           
        }
        private void destroy(float dis) 
        {
            float D = Vector3.Distance(start_pos, transform.position);
            if (D >= dis)
            {
                transform.gameObject.SetActive(false);
            } 
        }
        void OnTriggerEnter(Collider collider)
        {
            if (collider.transform.name == "Cylinder")
            {
                transform.gameObject.SetActive(false);
            }
        }
    }
}

武器代碼:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

namespace tomo
{
    public class weapon : MonoBehaviour
    {

        public GameObject Bullet;
        public Transform shootPostion; 
               

        // Use this for initialization
        void Start()
        {

        }

        // Update is called once per frame
        void Update()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                Create_Bullet(shootPostion.position);
            } 
               
        }
        public void Create_Bullet(Vector3 sp)
        {
            List<GameObject> list = pool.getObj(Bullet);
            if (list.Count > 0)
            {              
                pool.reset(list[0], sp, transform.rotation);                
                list[0].SetActive(true);
                //return list[0];
            }
            else
            {
                GameObject obj = GameObject.Instantiate(Bullet, sp, transform.rotation) as GameObject;
                pool.inputObj(obj);
                //return obj;
            }
        }
    }
}

對象池代碼:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
namespace tomo {
    public class pool : MonoBehaviour {

        // Use this for initialization
        //public static List<GameObject> pooledObj = new List<GameObject>();
        public static Dictionary<string, List<GameObject>> dictionary = new Dictionary<string, List<GameObject>>();

        void Start() {

        }

        // Update is called once per frame
        void Update() {

        }

        //將新建子彈加入對象池列表
        public static void inputObj(GameObject obj)
        {
            //Debug.Log("......"+obj);
            //pooledObj.Add(obj);
            var tagString = obj.tag;
            
            if (dictionary.ContainsKey(tagString))
            {
                dictionary[tagString].Add(obj);
            }
            else
            {
                List<GameObject> list = new List<GameObject>();
                list.Add(obj);
                dictionary.Add(tagString, list);
            }            
        }

        public void OnClickShowDictionary()
        {
            foreach (var item in dictionary.Keys)
            {
                var list = dictionary[item];
                foreach (var it in list)
                {
                    Debug.LogError("tag " + it.tag + " name " + it.name);
                }
            }
        }
        //在對象池列表中找到隱藏的對象
        public static List<GameObject> getObj(GameObject obj)
        {
            List<GameObject> list = new List<GameObject>();
            foreach (var tag in dictionary.Keys)
            {
                if (tag == obj.tag)
                {
                    List<GameObject> dic_list = dictionary[tag];
                    for (int i = 0; i < dic_list.Count; i++)
                    {
                        if (dic_list[i].activeSelf == false)
                        {
                            list.Add(dic_list[i]);
                        }
                    }
                }
            }
            
            return list;
        }

        public static void reset(GameObject obj, Vector3 position, Quaternion rotation)
        {
            obj.transform.position = position;
            obj.transform.rotation = rotation;
  
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末飘言,一起剝皮案震驚了整個(gè)濱河市衣形,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌姿鸿,老刑警劉巖谆吴,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)岗宣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腻菇,“玉大人,你說我怎么就攤上這事苫拍∥叻保” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵绒极,是天一觀的道長骏令。 經(jīng)常有香客問我,道長垄提,這世上最難降的妖魔是什么榔袋? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮铡俐,結(jié)果婚禮上凰兑,老公的妹妹穿的比我還像新娘。我一直安慰自己审丘,他們只是感情好吏够,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滩报,像睡著了一般锅知。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脓钾,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天售睹,我揣著相機(jī)與錄音,去河邊找鬼可训。 笑死昌妹,一個(gè)胖子當(dāng)著我的面吹牛捶枢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播飞崖,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼烂叔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚜厉?” 一聲冷哼從身側(cè)響起长已,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤畜眨,失蹤者是張志新(化名)和其女友劉穎昼牛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體康聂,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贰健,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恬汁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伶椿。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖氓侧,靈堂內(nèi)的尸體忽然破棺而出脊另,到底是詐尸還是另有隱情,我是刑警寧澤约巷,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布偎痛,位于F島的核電站,受9級特大地震影響独郎,放射性物質(zhì)發(fā)生泄漏踩麦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一氓癌、第九天 我趴在偏房一處隱蔽的房頂上張望谓谦。 院中可真熱鬧,春花似錦贪婉、人聲如沸反粥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽才顿。三九已至,卻和暖如春鬼譬,著一層夾襖步出監(jiān)牢的瞬間娜膘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工优质, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竣贪,地道東北人军洼。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像演怎,于是被迫代替她去往敵國和親匕争。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

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