1. 程式人生 > >Unity3D物件池的理解與小例子

Unity3D物件池的理解與小例子

最近在學習Unity3D,在製作一個跑酷Demo的時候,發現不停的初始化障礙物和刪除障礙物比較卡,後來研究了一下物件池,整了大半天,總算是明白了。現在記錄下來,希望能幫助和我一樣的新手,如果有不對的地方,還請大牛指正!

本文大部分借鑑了這篇文章

物件池的概念:在啟用物件時,它從池中提取。在停用物件時,它放回池中,等待下一個請求。(來自百度);

背景:跑酷遊戲,道路上有障礙物,角色身後的障礙物消失,角色前面隨機生成障礙物

你所需要的最基本的三樣東西:

1、一個池子:用來裝你所需的物品,和回收物品;

2、一個取物品的方法;

3、一個放物品的方法;

有這3樣東西,你就可以建造物件池了

以下是完整的程式碼部分,裡面有詳細的註釋

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


public class GameObjectPool : MonoBehaviour {

	// Use this for initialization

    //單例模式,如果不知道的話可以百度一下,這裡不解釋了,因為水平有限
    public static GameObjectPool instance;
    
    //下面這句是用字典構造你的池子,字典裡的String就是坑的名字,每一個坑對應一個GameObject列表
    Dictionary<string, List<GameObject>> pool = new Dictionary<string, List<GameObject>>() { };

	void Start () {
        instance = this;//單例模式
	}

    //從池子得到物體的方法,傳遞兩個引數,你需要得到的物體,和你需要放置的位置
    //你所需的物體應該已經制作成預置物體
    public GameObject GetPool(GameObject go,Vector3 position)
    {
        string key = go.name+"(Clone)";//要去拿東西的坑名字

        GameObject rongqi; //你用來取物體的容器;


        //下面分三種情況來分析
        if (pool.ContainsKey(key) && pool[key].Count > 0)//如果坑存在,坑裡有東西
        { 
            //直接拿走坑裡面的第一個
            rongqi = pool[key][0];
            pool[key].RemoveAt(0);//把第一個位置釋放;
        }
        else if (pool.ContainsKey(key) && pool[key].Count <= 0)//坑存在,坑裡沒東西
        {
            //那就直接初始化一個吧
            rongqi = Instantiate(go,position,Quaternion.identity) as GameObject;
        }
        else  //沒坑
        { 
            //不僅要初始化,還要把坑加上
            rongqi = Instantiate(go, position, Quaternion.identity) as GameObject;
            pool.Add(key, new List<GameObject>() { });
        }

        //調整物體初始狀態
        rongqi.SetActive(true);

        //這裡我加了一個子物體也顯示的程式碼,你可以不用加
        foreach (Transform child in rongqi.transform)
        {
            child.gameObject.SetActive(true);
        }

        //位置初始化
        rongqi.transform.position = position;
        return rongqi;
    }

    //放入池子中的方法
    public void IntoPool(GameObject go)
    {
        //理論上我們的東西都是從坑裡拿出來的,所以放物體進去的時候肯定有他的坑,可以直接放入,不用分情況了
        string key = go.name;
        pool[key].Add(go);
        go.SetActive(false);
    }
    
}

</pre><pre name="code" class="csharp">

相關推薦

Unity3D物件理解例子

最近在學習Unity3D,在製作一個跑酷Demo的時候,發現不停的初始化障礙物和刪除障礙物比較卡,後來研究了一下物件池,整了大半天,總算是明白了。現在記錄下來,希望能幫助和我一樣的新手,如果有不對的地方,還請大牛指正! 本文大部分借鑑了這篇文章 物件池的概念:在啟用物件

Java常量理解總結

final java 地址 表達式 語句 www 表示 new 基礎 一.相關概念 什麽是常量用final修飾的成員變量表示常量,值一旦給定就無法改變!final修飾的變量有三種:靜態變量、實例變量和局部變量,分別表示三種類型的常量。 Class文件中的常

關於函數return的一些理解實例

關於 wan var turn function nbsp ret on() bject 先看代碼: function example (){   var index=1;   return {//像這種加個大括號的就是返回一個對象了,而不僅僅是一個值     index,

一、unity3D物件————單個物件中的建立

  物件池:物件儲存在一個池子中,當需要再次使用時取出,而不需要每次都例項化一個新的物件,將物件迴圈利用起來。當我們需要大量例項化物件時可採用物件池,如遊戲中的子彈等物體,當我們玩射擊類遊戲時,要發射大量子彈,如果每發子彈直接通過Instantiate全部例項化(筆者在unity中試過大量Inst

js面向物件寫法,一個例子

/** * * 這是一個校驗檔案 */ var MyValidation = function(){ //校驗資料庫 this.validDatabase = function

Unity3d物件(全)

PoolManager.cs:using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; public class Pool

Unity3D-物件技術

什麼是物件池 物件池定義:物件池就存放需要被反覆呼叫資源的一個空間,當一個物件回大量生成的時候如果每次都銷燬建立會很費時間,通過物件池把暫時不用的物件放到一個池中(也就是一個集合),當下次要重新生成這個物件的時候先去池中查詢一下是否有可用的物件,如果有的話就直

Unity3D 物件思想 在遊戲開發中的運用

分類:U3D 1.在王者榮耀中,每30秒小兵會出現一波,出現之後會被敵方玩家或敵方小兵銷燬,一局遊戲下來,小兵會被建立多次,同時也會被銷燬,在遊戲中,這種頻繁的建立和銷燬遊戲物件是很損耗效能的。在遊戲開發過程中,我們會頻繁的建立物件和銷燬物件,為了提高遊戲效能,我們就要用到物件池思想了。 2.在射

對於字節順序——大端端的理解

image 應該 產生 出錯 混合 nat 轉換 位置 字符串 之前我對大小端的理解是數據存放方式不同,最近在讀《計算機組成-結構化方法》一書時發現,並不是存放方式不同,而是字節地址的編排方式不同,換句話說,存的位置都是一樣的,只不過這個位置因為編址方式的不同使得它的地址編

【知了堂學習筆記】--關於對Node.js訪問數據庫連接理解簡單的建立---@wan<

png 程序 數據庫連接池 新建 -s const 服務 pre conf 是什麽數據庫連接池 官方解釋:數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是再重新建立一個;釋放空閑時間超過最大空閑時間的數據庫連接來避免因為沒有

線程理解簡單實現

進行 常見 內存分配 RoCE 這一 釋放資源 管理系 延長 ESS 池 由於服務器的硬件資源“充裕”,那麽提高服務器性能的一個很直接的方法就是以空間換時間,即“浪費”服務器的硬件資源,以換取其運行效率。這就是池的概念。 池是一組資源的集合,這組資源在服務器啟動之初就被創建

例子理解多態

perm clas byte In AI 理解 ID 子類 static class Demo3_SuperMan { public static void main(String[] args) { Person p = new SuperMan(

nodesocket.io搭配例子-轉載

pst border ava bsp lob vps min 信息 click //服務端代碼 io = require(‘socket.io‘).listen(app), fs = require(‘fs‘), cookie=require(‘cookie‘);

c/c++ 模板STL例子系列<一 >自建Array數組

stl 編譯不過 header space eve fine ray size new t c/c++ 模板與STL小例子系列<一> 自建Array數組 自建的Array數組,提供如下對外接口 方法 功能描述 Array() 無參數構造方法,構造元

c/c++ 模板STL例子系列<二> 模板類友元函數

vat stream col ons cout include ios ring 沒有 c/c++ 模板與STL小例子系列<二> 模板類與友元函數 比如某個類是個模板類D,有個需求是需要重載D的operator<<函數,這時就需要用到友元。 實現這樣

OpenMPMPI混合程式設計例子

訪問本站觀看效果更佳 title: OpenMP與MPI混合程式設計小例子 tags: openmp mpi 下面的例子比較簡單,主要為說明使用OpenMP以及MPI的混合編譯命令。 #include "mpi.h" #include "omp.h"

MPI_SendMPI_Recv例子

訪問本站觀看效果更佳 函式原型 MPI_Send int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) 引數: buf:傳送緩衝區的首地址

MPI_IsendMPI_Irecv例子

訪問本站觀看效果更佳 與MPI_Send與MPI_Recv不同,MPI_Isend與MPI_Irecv均為非阻塞式通訊。 函式原型: MPI_Isend int MPI_Isend(const void *buf, int count, MPI_Datatype datatype, in

MPI_Comm_groupMPI_Comm_create_group例子

訪問本站觀看效果更佳 函式原型 MPI_Comm_group( MPI_Comm comm, MPI_Group* group) group 和communicator類似,但是缺少上下文所以無法實現程序間通訊,只能獲取組間的rank以及size。 MPI_Comm_cre

深入淺出地理解springmvc及第一個例子

Spring MVC框架是有一個MVC框架,通過實現Model-View-Controller模式來很好地將資料、業務與展現進行分離。從這樣一個角度來說,Spring MVC和Struts、Struts2非常類似。Spring MVC的設計是圍繞DispatcherS