Unity Object Pool

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

[System.Serializable]
public class ObjectPoolItem
{
    public GameObject objectToPool;

    public int amountToPool;

    public bool shouldExpand = true;
}

public class ObjectPooler : MonoBehaviour
{
    public static ObjectPooler SharedInstance;

    public List<GameObject> pooledObjects;

    public List<ObjectPoolItem> itemToPool;

    void Awake()
    {
        SharedInstance = this;
    }

    private void Start()
    {
        pooledObjects = new List<GameObject>();
        foreach(ObjectPoolItem item in itemToPool)
        {
            for (int i = 0; i < item.amountToPool; i++)
            {
                GameObject obj = (GameObject)Instantiate(item.objectToPool);
                obj.SetActive(false);
                pooledObjects.Add(obj);
            }
        }

    }

    public GameObject GetPooledObject(string tag)
    {
        for (int i = 0; i < pooledObjects.Count; i++)
        {
            if (!pooledObjects[i].activeInHierarchy && pooledObjects[i].tag == tag)
            {
                return pooledObjects[i];
            }
        }
        foreach (ObjectPoolItem item in itemToPool)
        {
            if (item.objectToPool.tag == tag)
            {
                if (item.shouldExpand)
                {
                    GameObject obj = (GameObject)Instantiate(item.objectToPool);
                    obj.SetActive(false);
                    pooledObjects.Add(obj);
                    return obj;
                }
            }
        }
        return null;
    }

}
时间: 2024-11-08 18:08:03

Unity Object Pool的相关文章

Unity Object Pool完全体

using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class ObjectPool<T> { private readonly Stack<T> stack = new Stack<T>(); private readonly Func<T> actionOnNew; private readonly Unit

Object Pool 对象池的C++11使用(转)

很多系统对资源的访问快捷性及可预测性有严格要求,列入包括网络连接.对象实例.线程和内存.而且还要求解决方案可扩展,能应付存在大量资源的情形. object pool针对特定类型的对象循环利用,这些对象要么创建开销巨大,要么可创建的数量有限.而且在pool中的对象需要做到无状态. 然后转了这位博主的代码,还在研究中 const int MaxObjectNum = 10; template <typename T> class ObjectPool { template <typename

Unity内存管理之对象池(Object Pool)

第一篇博客,打算和大家分享一下关于Unity开发当中用到的对象池,那么何为对象池呢? [对象池]:对象池是一种经常用到的内存管理服务,它的作用在于可以减少从头创建每个对象的系统开销. 众所周知,在Unity游戏开发的过程中经常会创建一些新的对象,如果数量较少还可以接受,如果创建的新对象数量庞大,那么对内存而言是一个极大的隐患.例如射击游戏当中,每发射一颗子弹,都要创建一个新的子弹对象,那么子弹是数量庞大,可想而知一场游戏当中会创建多少这样的新对象,那么如果这些子弹创建之后都对游戏起着关键且持续性

[译]Unity3D内存管理——对象池(Object Pool)

从一个简单的对象池类开始说起 对象池背后的理念其实是非常简单的.我们将对象存储在一个池子中,当需要时在再次使用,而不是每次都实例化一个新的对象.池的最重要的特性,也就是对象池设计模式的本质是允许我们获取一个“新的”对象而不管它真的是一个新的对象还是循环使用的对象.该模式可以用以下简单的几行代码实现: public class ObjectPool<T> where T : class, new() { private Stack<T> m_objectStack = new Sta

Unity Object类

Object是unity中所有对象的基类.所以觉得有必要做出整理. 首先 DontDestroyOnLoad 就是Object类的静态方法 , 楼主在前面的博客中有详细的介绍.这里只提一下,不做任何介绍. 一 , 关于实例方法: ① :GetInstanceID -> 放回Object对象的ID号 定义 : public int GetInstanceID() (每一个GameObject , 组件 及其子类都有一个唯一的ID号 , 包括Clone的) 二 ,关于静态方法: ① : Destro

UNITY 2015 大会 观展记录

div#cpmenu {height:200px;float:left;} div#cpcontent {height:200px;width:150px;float:left;} 文章作者:松阳 原文链接:http://blog.csdn.net/fansongy/article/details/45133909 题记 折折腾腾的晃了一天,感觉这次会议干货还是挺多的.听了不少有的没的,记录一下,走过撸过不要错过.所谓无图无真相,先上一张跟Unity大叔的合影: 上午主会 开场高富帅CEO出来各

(转)Unity原厂讲师大解密

本文转载自:http://nedwu13.blogspot.tw/2013_11_01_archive.html Asset Bundle工作流程及人物換裝實例 - 劉剛 Unity內部的資源有兩種(斯斯有兩種?): Resources:有10年歷史,儘量用Asset Bundle Asset Bundle:暱稱AB,現今Unity處理資源的中心 AB選項的差異 透過Web Player下載Asset Bundle的Cache需要收費,在iOS,Android的Cache不需收費.--->手持遊

Unity开发-你必须知道的优化建议

转自:http://blog.csdn.net/leonwei/article/details/18042603 最近研究U3D开发,个人认为,精通一种新的技术,最快最好的方法就是看它的document,而且个人习惯不喜欢看中文的资料,原汁原味的东西是最正确的,一翻译过来很多东西就都不那么准确了.于是通读了unity的官方manuel,最后面几章都是精华,里面给了非常非常多的官方的优化建议,尤其是做移动平台的开发,这些建议就是非常重要的.我将官方manuel advanced后面的那几个章节的东

Unity原厂讲师大解密

本文转载自:http://nedwu13.blogspot.tw/2013_11_01_archive.html (墙外) 笔记:20131030 Unity原厂讲师大解密 Asset Bundle工作流程及人物换装实例- 刘刚 Unity内部的资源有两种(斯斯有两种?): Resources:有10年历史,尽量用资产包 Asset Bundle:昵称AB,现今Unity处理资源的中心 AB选项的差异 透过Web Player下载Asset Bundle的Cache需要收费,在iOS,Andro