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 UnityAction<T> actionOnGet;
private readonly UnityAction<T> actionOnRelease; public int CountAll { get; private set; }
public int CountInactive { get { return stack.Count; } }
public int CountActive { get { return CountAll - CountInactive; } } public ObjectPool(Func<T> onNew, UnityAction<T> onGet = null, UnityAction<T> onRelease = null)
{
actionOnNew = onNew;
actionOnGet = onGet;
actionOnRelease = onRelease;
} public T Get()
{
T element;
if (stack.Count == )
{
element = actionOnNew == null ? default(T) : actionOnNew.Invoke();
CountAll++;
}
else
{
element = stack.Pop();
} if (actionOnGet != null) { actionOnGet.Invoke(element); }
return element;
} public void Release(T element)
{
if (stack.Count > && ReferenceEquals(stack.Peek(), element))
{
Debug.LogError("Internal error. Trying to destroy object that is already released to pool.");
} if (actionOnRelease != null) { actionOnRelease.Invoke(element); } stack.Push(element); if (stack.Count > CountAll)
{
CountAll = stack.Count;
}
}
}

使用泛型和委托简化代码,扩展性强。

使用示例:

Bullet类:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class Bullet : MonoBehaviour
{
private int speed; private int damage; private float lifeTime = 10.0f; private float lifeTimer = ; public delegate void BulletDestroyEvent(Bullet bullet); public event BulletDestroyEvent OnBulletDestroy;
public int Speed
{
get { return speed; }
set { speed = value; }
} public int Damage
{
get { return damage; }
set { damage = value; }
} public float LifeTime
{
get { return lifeTime; }
set { lifeTime = value; }
} void Start ()
{ } void Update ()
{
if(Input.GetKeyDown(KeyCode.Mouse1))
{
OnBulletDestroy.Invoke(this);
} lifeTimer += Time.deltaTime;
if(lifeTimer >= LifeTime)
{
lifeTimer = 0.0f;
OnBulletDestroy.Invoke(this);
}
} void OnCollisionEnter(Collision collision)
{
OnBulletDestroy.Invoke(this);
}
}

ObjectPoolManager:

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class ObjectPoolManager : MonoBehaviour
{
public GameObject bulletPrefab; public ObjectPool<Bullet> bulletPool; public List<Bullet> bulletList;
void Start ()
{
bulletPool = new ObjectPool<Bullet>(BulletPoolOnNew,BulletOnGet,BulletOnRelease);
} void Update ()
{
if(Input.GetKeyDown(KeyCode.Mouse0))
{
//generate one bullet
bulletList.Add(bulletPool.Get());
} if(Input.GetKeyDown(KeyCode.W))
{
//delete one bullet
bulletPool.Release(bulletList[]);
}
} //pool method
Bullet BulletPoolOnNew()
{
var bulletObject = Instantiate(bulletPrefab) as GameObject; bulletObject.GetComponent<Bullet>().OnBulletDestroy += bulletPool.Release; return bulletObject.GetComponent<Bullet>();
} void BulletOnGet(Bullet bullet)
{
bullet.gameObject.SetActive(true);
} void BulletOnRelease(Bullet bullet)
{
bullet.gameObject.SetActive(false);
}
}

Unity Object Pool完全体的更多相关文章

  1. Unity Object Pool

    using System.Collections; using System.Collections.Generic; using UnityEngine; [System.Serializable] ...

  2. 设计模式之美:Object Pool(对象池)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...

  3. Object Pool

    设计模式之美:Object Pool(对象池)   索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 意图 运用对象池化 ...

  4. .NET Core中Object Pool的简单使用

    前言 复用,是一个重要的话题,也是我们日常开发中经常遇到的,不可避免的问题. 举个最为简单,大家最为熟悉的例子,数据库连接池,就是复用数据库连接. 那么复用的意义在那里呢? 简单来说就是减少不必要的资 ...

  5. What are the differences between Flyweight and Object Pool patterns?

    What are the differences between Flyweight and Object Pool patterns? They differ in the way they are ...

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

    很多系统对资源的访问快捷性及可预测性有严格要求,列入包括网络连接.对象实例.线程和内存.而且还要求解决方案可扩展,能应付存在大量资源的情形. object pool针对特定类型的对象循环利用,这些对象 ...

  7. 对象池模式(Object Pool Pattern)

    本文节选自<设计模式就该这样学> 1 对象池模式的定义 对象池模式(Object Pool Pattern),是创建型设计模式的一种,将对象预先创建并初始化后放入对象池中,对象提供者就能利 ...

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

    原文地址:C# Memory Management for Unity Developers (part 3 of 3), 其实从原文标题可以看出,这是一系列文章中的第三篇,前两篇讲解了从C#语言本身 ...

  9. Java小对象的解决之道——对象池(Object Pool)的设计与应用

    一.概述 面向对象编程是软件开发中的一项利器,现已经成为大多数编程人员的编程思路.很多高级计算机语言也对这种编程模式提供了很好的支持,例如C++.Object Pascal.Java等.曾经有大量的软 ...

随机推荐

  1. CSS3 文字与字体相关样式

    给文字添加阴影 文字换行 客户端文字 font-size-adjust属性 给文字添加阴影-text-shadow属性 text-shadow:length length length color 前 ...

  2. HTTPS加密流程超详解(二)

    2.进入正题 上篇文章介绍了如何简单搭建一个环境帮助我们分析,今天我们就进入正题,开始在这个环境下分析. 我们使用IE浏览器访问Web服务器根目录的test.txt文件并抓包,可以抓到如下6个包(前面 ...

  3. 深入理解 React JS 中的 setState

    此文主要探讨了 React JS 中的 setState 背后的机制,供深入学习 React 研究之用. 在课程 React.js入门基础与案例开发 中,有些同学会发现 React JS 中的 set ...

  4. Python第二十天 shutil 模块 zipfile tarfile 模块

    Python第二十天  shutil 模块  zipfile   tarfile 模块 os文件的操作还应该包含移动 复制  打包 压缩 解压等操作,这些os模块都没有提供 shutil 模块shut ...

  5. animate.css – 齐全的CSS3动画库

    animate.css – 齐全的CSS3动画库 演 示 下 载   简介 animate.css 是一个来自国外的 CSS3 动画库,它预设了抖动(shake).闪烁(flash).弹跳(bounc ...

  6. pythonseleniumAPI

    一.浏览器操作 1.浏览器最大化 driver.maximize_window() #将浏览器最大化显示 2.设置浏览器宽.高 driver.set_window_size(480, 800)#设置浏 ...

  7. 快速开发基于 HTML5 网络拓扑图应用--入门篇(一)

    计算机网络的拓扑结构是引用拓扑学中研究与大小,形状无关的点.线关系的方法.把网络中的计算机和通信设备抽象为一个点,把传输介质抽象为一条线,由点和线组成的几何图形就是计算机网络的拓扑结构.网络的拓扑结构 ...

  8. 第十七章:Python の Web开发基础(四) MVC与Django

    本課主題 MVC 介绍 Django 介紹 MVC 介绍 controllers 处理用户请求 views 放置HTML模版 models 操作数据库 MVC框架就是目录的归类 MVC 是一种软件开发 ...

  9. Proof of Elapsed Time--Hyperledger Sawtooth 共识算法

    这一片文章中我们介绍一下Hyperledger Sawtooth项目中所提出的PoET共识算法, 现有的区块链共识算法大概可以分为两种: Nakamoto consensus:通过乐透的方式选择出一个 ...

  10. Hyperledger Fabric 本地运行的简单示例

    环境: Ubuntu 16.04 go 1.7.4 版本: Fabric v1.0.0-alpha 本文主要目的就是让大家体验以下Fabric网络环境搭建的具体过程,不基于集成化脚本手动搭建. 一.编 ...