unity中實現簡單物件池,附教程原理
Chinar 堅持將簡單的生活方式,帶給世人! (擁有更好的閱讀體驗 —— 高解析度使用者請根據需求調整網頁縮放比例) |
助力快速完成 Unity 物件池的建立與使用 為新手節省寶貴的時間,避免採坑! |
Chinar 教程效果:
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>
/// 物件池(重複呼叫/使用的遊戲物體) 子彈,技能,導彈,敵人
/// </summary>
public class ObjectPool : MonoSingleton<ObjectPool>
{
//欄位 池 技能預設物(因為一個技能可能有多個預製件) 技能的複用性
private Dictionary<string, List<GameObject>> cache = new Dictionary<string, List<GameObject>>();
int i = 0; //標記 0
/// <summary>
/// 建立顯示物件
/// </summary>
/// <returns>The object.</returns>
/// <param name="key">物件名稱</param>
/// <param name="go">物件的預製件</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; //設定位置
tempgo.transform.rotation = quaternion; //旋轉資訊
}
else //否則,就是空了。(也就是沒能從池子裡取出物件)
{
tempgo = Instantiate(go, position, quaternion); //那就根據傳入的預設物,生成一個新物體
print("例項化物體數量:" + 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當中所有的物件
for (int i = 0; i < cache[key].Count; i++)
{
Destroy(cache[key][i]);
}
//清除鍵當中的所有值
//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>
/// 測試物件池的呼叫
/// </summary>
public class PoolTest : MonoBehaviour
{
GameObject go; //臨時物件
GameObject item; //臨時物件池物件
void Start()
{
go = Resources.Load<GameObject>("Cube"); //在Resources檔案目錄下做一個Cube預設物
}
void Update()
{
if (Input.GetKey(KeyCode.Space)) //按下空格建立一個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)) //按下左鍵執行回收物件
{
if (item != null)
{
ObjectPool.Instance.CollectObject(item, 0.2f);
}
}
if (Input.GetMouseButtonDown(1)) //按下右鍵執行清除已經生成的物件
{
ObjectPool.Instance.Clear("Object1");
}
}
}
支援
May Be —— 搞開發,總有一天要做的事!
Chinar 提供一站式教程,閉眼式建立! 為新手節省寶貴時間,避免採坑! |
Chinar
本部落格為非營利性個人原創,除部分有明確署名的作品外,所刊登的所有作品的著作權均為本人所擁有,本人保留所有法定權利。違者必究
對於需要複製、轉載、連結和傳播部落格文章或內容的,請及時和本博主進行聯絡,留言,Email: [email protected]
對於經本博主明確授權和許可使用文章及內容的,使用時請註明文章或內容出處並註明網址
相關推薦
unity中實現簡單物件池,附教程原理
Unity物件池的建立與使用 本文提供全流程,中文翻譯。 Chinar 堅持將簡單的生活方式,帶給世人!(擁有更好的閱讀體驗 —— 高解析度使用者請根據需求調整網頁縮放比例) Chinar —— 心分享、心創新!助力快速完成 Unity
在unity中實現簡單的程式紋理 10.3.1
using UnityEngine; using System.Collections; using System.Collections.Generic; //在unity中實現簡單的程式紋理 10.3.1 //在編輯模式執行 [ExecuteInEditMo
初探CardBoard:(1)在Unity中實現簡單VR場景
為何使用CardBoard 現在的VR越來越流行,各種裝置也是百花齊放。然而,對於研究VR剛剛起步的小白來說,昂貴的裝置(例如HTC)並不一定是最佳選擇。那麼Google 的CardBoard就映入了我眼前。 價格低廉 使用它僅僅需要以下裝置: 一個光學盒子
Unity優化篇:物件池的建立與使用。(簡單且實用)
1.物件池是什麼? 物件池是一種Unity經常用到的記憶體管理服務,它的作用在於可以減少建立每個物件的系統開銷。 2.為什麼要使用物件池? 在Unity遊戲開發的過程中經常會建立一些新的物件,如果數量較少還可以接受,如果建立的新物件數量龐大,那麼對記憶體而言是一個極大的
unity中計算vector3的角度,帶正負的程式碼實現
unity中Vector3自帶了一個Vector3.Angle的函式,用於計算兩個vector3向量的夾角,文件中描述的: The angle returned is always the non reflex angle between the two vectors – ie
Lua實現的物件池,Unity
local PrefabObjectPool = {}PrefabObjectPool.__index = PrefabObjectPool function PrefabObjectPool.New(prefab,capcity) if prefab == nil t
【Lua學習筆記】 Lua中實現面向物件,轉自雲風的部落格
local _class={} function class(super) local class_type={} class_type.ctor=false class_type.super=super class_type.new=function(...) local obj={}
spring+ActiveMQ+JMS+執行緒池實現簡單的分散式,多執行緒,多工的非同步任務處理系統
前言:隨著系統的業務功能不斷增強,傳統的單機、單任務,單執行緒的執行模式已經逐漸的被淘汰,取而代之的是分散式,多工,多執行緒,當然,現在開源的這方面的框架也非常的多,大概的思想也都類似,下面就結合我這一年多的工作心得,分享一個簡單易實現的分散式,多工,多執行緒的非同步任務處理系統的基本實現。 1.系統部署圖
unity中實現三個Logo圖片進行3秒鐘的若隱若現後互相切換Logo圖片
date += srp val logs ima 精靈 texture 透明 private List<Sprite> storeTexture; public void Start() { storeTextu
關於Unity中實現繩索物理效果 Obi - Advanced Rope Simulation插件解析
阻尼 旋轉 eval mil 抖動 amp ola all 動作 Obi - Advanced Rope Simulation 繩索插件學習文檔 插件分享: 鏈接:https://pan.baidu.com/s/1eTwZOrg 密碼:p8wa //插件導入有錯誤產生,將
工廠模式在Unity中的簡單應用
鍵盤 並且 IT ima 編寫 file 工廠 mage image 使用一個簡單的小例子來說明Unity開發中如何使用工廠模式來獲取精靈並且加載 1.創建個Unity的工程,起名叫FactoryDemo,並在Asset下創建相應文件夾 Sprite用來存放原圖以及分割後
Unite 2018 | 《崩壞3》:在Unity中實現高品質的卡通渲染
width diffuse 動態生成 LG 編輯 www. tgs term 謝謝 本篇文章為Unity官方論壇發布的文章 由於全是幹貨,為了方便自己查找,也為了避免刪除找不到了 於是復制了過來。。。 原文地址: http://forum.china.unity3d.c
[環境搭建]mininet中實現隨機流量模型,20180130
png 自動保存 don 一次 gin tput 9.png run sting [環境搭建]mininet中實現隨機流量模型本文記錄了如何實現“mininet拓撲中任意一臺主機以等概率隨機向另外一臺主機發送一條UDP數據流,並將iperf測試結果自動保存到文件”的方法,概
記錄一下在SpringBoot中實現簡單的登錄認證
博客 sca 訪問 oid web font 思路 upload 第一次 代碼參考博客: https://blog.csdn.net/weixin_37891479/article/details/79527641 在做學校的課設的時候,發現了安全的問題,就不懷好意的用戶有
C#或unity中實現正弦函式
C#或unity中實現正弦函式 本類用於第一,需要繪製一條正弦曲線的朋友;第二,需要根據正弦曲線控制物體運動的朋友;裡面都有註釋,程式碼如下: unity中使用的程式碼: public class Curvy_Sin { /// <summary> /// 週期
Unity中實現控制物體以自定義的速度沿Y軸旋轉90度(也可自定義度數)後停止,然後返回原來位置
1、需要控制沿Y軸旋轉的物體,如下所示: 2、編寫控制該物體旋轉的指令碼,如下所示: using UnityEngine; using System.Collections; public class Test_CycleRoate : MonoBehaviour {
[引擎]之四:unity中檢視簡單mesh頂點順序的小工具——修改
https://blog.csdn.net/yanchezuo/article/details/78978884 1 新增檢視頂點位置和uv資訊 2 相容頂點數量和uv數量不同的情況 3 新增是否顯示資訊的選項 4 完整程式碼 5 最後 這裡製作的小工具,功能有點單薄,只能檢視頂點的順序。&nb
【小家java】Java中的執行緒池,你真的用對了嗎?(教你用正確的姿勢使用執行緒池)
相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9
【隨堂筆記】unity中socket用法(三,伺服器端執行緒的使用)
手機專案,最好不要使用執行緒,因為unity專門提供了協程,枝執行緒不能訪問主執行緒(ui) 手機使用執行緒,容易導致硬體出問題 執行緒測試程式碼 /// <summary> /// 執行緒的測試方法 /// </summary>
JAVAWeb中實現簡單郵箱找回密碼
版權宣告:本文為博主原創文章,未經博主允許不得轉載。https://blog.csdn.net/qq_40348465/article/details/83629000 本文是介紹在一個小的JAVAWeb專案中,利用郵箱幫使用者找回密碼。 效果展示 &