日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

unity中实现简单对象池,附教程原理

發(fā)布時間:2024/1/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 unity中实现简单对象池,附教程原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Unity對象池的創(chuàng)建與使用


本文提供全流程,中文翻譯。

Chinar 堅持將簡單的生活方式,帶給世人!

(擁有更好的閱讀體驗 —— 高分辨率用戶請根據(jù)需求調(diào)整網(wǎng)頁縮放比例)



Chinar —— 心分享、心創(chuàng)新!

助力快速完成 Unity 對象池的創(chuàng)建與使用

為新手節(jié)省寶貴的時間,避免采坑!


Chinar 教程效果:


  • 1
    • MonoSingleton —— 單例基類
  • 2
    • ObjectPool —— 對象池
  • 3
    • PoolTest —— 測試對象池的使用
  • 支持
    • May Be —— 搞開發(fā),總有一天要做的事!

全文高清圖片,點擊即可放大觀看 (很多人竟然不知道)


1

MonoSingleton —— 單例基類


任何繼承自 MonoSingleton 泛型基類的腳本/類 都是單例類

using UnityEngine;/// <summary> /// 泛型單例基類 —— 任何繼承自該類的類,都是單例類 /// </summary> /// <typeparam name="T">泛型</typeparam> public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T> {private static T instance;public static T Instance{get{if (instance == null){instance = FindObjectOfType(typeof(T)) as T;if (instance == null) instance = new GameObject("Chinar Single of " + typeof(T).ToString(), typeof(T)).GetComponent<T>();}return instance;}}private void Awake(){if (instance == null) instance = this as T;}private void OnApplicationQuit(){instance = null;} }

2

ObjectPool —— 對象池


新建一個腳本 ObjectPool 繼承自泛型基類 MonoSingleton《ObjectPool》

是以 ObjectPool 就會是一個單例類

using System.Collections; using System.Collections.Generic; using UnityEngine;/// <summary> /// 對象池(重復(fù)調(diào)用/使用的游戲物體) 子彈,技能,導(dǎo)彈,敵人 /// </summary> public class ObjectPool : MonoSingleton<ObjectPool> {//字段 池 技能預(yù)設(shè)物(因為一個技能可能有多個預(yù)制件) 技能的復(fù)用性private Dictionary<string, List<GameObject>> cache = new Dictionary<string, List<GameObject>>();int i = 0; //標(biāo)記 0/// <summary>/// 創(chuàng)建顯示對象/// </summary>/// <returns>The object.</returns>/// <param name="key">對象名稱</param>/// <param name="go">對象的預(yù)制件</param>/// <param name="position">對象的新位置</param>/// <param name="quaternion">對象的角度</param>public GameObject CreateObject(string key, GameObject go, Vector3 position, Quaternion quaternion){GameObject tempgo = cache.ContainsKey(key) ? cache[key].Find(p => !p.activeSelf) : null; //返回池中未激活的對象,所有都被激活就返回空,賦值給臨時對象if (tempgo != null) //如果臨時對象不為空{tempgo.transform.position = position; //設(shè)置位置tempgo.transform.rotation = quaternion; //旋轉(zhuǎn)信息}else //否則,就是空了。(也就是沒能從池子里取出對象){tempgo = Instantiate(go, position, quaternion); //那就根據(jù)傳入的預(yù)設(shè)物,生成一個新物體print("實例化物體數(shù)量:" + i++);if (!cache.ContainsKey(key)) //池中沒有鍵{cache.Add(key, new List<GameObject>()); //新建一個 列表}cache[key].Add(tempgo); //給字典中的列表加入/add 臨時物體,如果有鍵就直接添加了}tempgo.SetActive(true); //并啟用臨時物體return tempgo; //返回}/// <summary>/// 直接回收/// </summary>/// <param name="go">Go.</param>public void CollectObject(GameObject go){go.SetActive(false);}/// <summary>/// 延遲回收/// </summary>/// <param name="go">Go.</param>/// <param name="delay">Delay.</param>public void CollectObject(GameObject go, float delay){StartCoroutine(Collect(go, delay));}private IEnumerator Collect(GameObject go, float delay){yield return new WaitForSeconds(delay);CollectObject(go);}/// <summary>/// 釋放資源/// </summary>/// <returns>The clear.</returns>/// <param name="key">Key.</param>public void Clear(string key){if (cache.ContainsKey(key)){//Destroy當(dāng)中所有的對象for (int i = 0; i < cache[key].Count; i++){Destroy(cache[key][i]);}//清除鍵當(dāng)中的所有值//cache[key].Clear();//清除這個鍵(鍵值一起清除)cache.Remove(key);}}/// <summary>/// 釋放所有對象池/// </summary>public void ClearAll(){var list = new List<string>(cache.Keys);for (int i = 0; i < list.Count; i++){Clear(list[i]);}} }

3

PoolTest —— 測試對象池的使用


新建一個腳本 PoolTest 用來測試對象池的使用

using UnityEngine;/// <summary> /// 測試對象池的調(diào)用 /// </summary> public class PoolTest : MonoBehaviour {GameObject go; //臨時對象GameObject item; //臨時對象池對象void Start(){go = Resources.Load<GameObject>("Cube"); //在Resources文件目錄下做一個Cube預(yù)設(shè)物}void Update(){if (Input.GetKey(KeyCode.Space)) //按下空格創(chuàng)建一個Cube{item = ObjectPool.Instance.CreateObject("Object1", go, Vector3.zero, new Quaternion(0, 0, 0, 0));item.transform.position += new Vector3(0, 0, 1);}if (Input.GetMouseButtonDown(0)) //按下左鍵執(zhí)行回收對象{if (item != null){ObjectPool.Instance.CollectObject(item, 0.2f);}}if (Input.GetMouseButtonDown(1)) //按下右鍵執(zhí)行清除已經(jīng)生成的對象{ObjectPool.Instance.Clear("Object1");}} }

支持

May Be —— 搞開發(fā),總有一天要做的事!


擁有自己的服務(wù)器,無需再找攻略!

Chinar 提供一站式教程,閉眼式創(chuàng)建!

為新手節(jié)省寶貴時間,避免采坑!


先點擊領(lǐng)取 —— 阿里全產(chǎn)品優(yōu)惠券 (享受最低優(yōu)惠)


1 —— 云服務(wù)器超全購買流程 (新手必備!)

2 —— 阿里ECS云服務(wù)器自定義配置 - 購買教程(新手必備!)

3—— Windows 服務(wù)器配置、運(yùn)行、建站一條龍 !

4 —— Linux 服務(wù)器配置、運(yùn)行、建站一條龍 !





Chinar


END

本博客為非營利性個人原創(chuàng),除部分有明確署名的作品外,所刊登的所有作品的著作權(quán)均為本人所擁有,本人保留所有法定權(quán)利。違者必究

對于需要復(fù)制、轉(zhuǎn)載、鏈接和傳播博客文章或內(nèi)容的,請及時和本博主進(jìn)行聯(lián)系,留言,Email: ichinar@icloud.com

對于經(jīng)本博主明確授權(quán)和許可使用文章及內(nèi)容的,使用時請注明文章或內(nèi)容出處并注明網(wǎng)址

總結(jié)

以上是生活随笔為你收集整理的unity中实现简单对象池,附教程原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。