1. 程式人生 > >unity中實現簡單物件池,附教程原理

unity中實現簡單物件池,附教程原理

Unity物件池的建立與使用

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

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

(擁有更好的閱讀體驗 —— 高解析度使用者請根據需求調整網頁縮放比例)
Chinar —— 心分享、心創新!

助力快速完成 Unity 物件池的建立與使用

為新手節省寶貴的時間,避免採坑!

Chinar 教程效果:

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

1

MonoSingleton —— 單例基類

任何繼承自 MonoSingleton 泛型基類的指令碼/類 都是單例類

舉個栗子黑白88

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 就會是一個單例類
舉個栗子黑白88

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 用來測試物件池的使用
舉個栗子黑白88

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
END

本部落格為非營利性個人原創,除部分有明確署名的作品外,所刊登的所有作品的著作權均為本人所擁有,本人保留所有法定權利。違者必究

對於需要複製、轉載、連結和傳播部落格文章或內容的,請及時和本博主進行聯絡,留言,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

【隨堂筆記】unitysocket用法(三伺服器端執行緒的使用)

手機專案,最好不要使用執行緒,因為unity專門提供了協程,枝執行緒不能訪問主執行緒(ui) 手機使用執行緒,容易導致硬體出問題 執行緒測試程式碼 /// <summary> /// 執行緒的測試方法 /// </summary>

JAVAWeb實現簡單郵箱找回密碼

  版權宣告:本文為博主原創文章,未經博主允許不得轉載。https://blog.csdn.net/qq_40348465/article/details/83629000 本文是介紹在一個小的JAVAWeb專案中,利用郵箱幫使用者找回密碼。   效果展示  &