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. df 命令详解

    一.df  作用:  显示磁盘分区上的可使用的磁盘空间, 默认显示单位为kb . 可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间的等信息. 选项: -a :包含全部的文件系统 -h :以 ...

  2. SpringBoot初步

    1.创建maven 项目 quickstart类型 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" ...

  3. 进程间通信 ipcs

    在linux系统上借助ipcs命令可以方便地查看进程间通信状态 操作系统:centos7.3 x86_64 应用软件: oracle12c

  4. ioutil包二

    ioutil包二 (原创随笔,转载请注明出处 http://www.cnblogs.com/majianguo/p/8016426.html) ioutil包实现了一些I/O实用功能,导出了7个函数和 ...

  5. 使用linux perf工具生成java程序火焰图

    pre.cjk { font-family: "Nimbus Mono L", monospace } p { margin-bottom: 0.1in; line-height: ...

  6. zabbix借助onealert实现微信报警

    官网:http://wiki.110monitor.com/integration/zabbix-manual.html) Zabbix安装包部署方式 1)下载agent软件包 请在Zabbix服务器 ...

  7. [js高手之路]html5 canvas动画教程 - 重力、摩擦力、加速、抛物线运动

    上节,我们讲了匀速运动,本节分享的运动就更有意思了: 加速运动 重力加速度 抛物线运动 摩擦力 加速运动: <head> <meta charset='utf-8' /> &l ...

  8. Redis学习笔记(二)Redis支持的5种数据类型的总结之String和Hash

    引言 在Redis学习笔记(一)中我们已经会安装并且简单使用Redis了,接下来我们一起来学习下Redis支持的5大数据类型. 简介 Redis是REmote DIctionary Server(远程 ...

  9. mysql分组查询前n条数据

    建表: CREATE TABLE hard(id INT,aa varchar(50) ,bb INT,PRIMARY key(id))insert into hard values(1,'a',9) ...

  10. linux 常见操作指令

    1.ssh root@ip ssh 登录 2.ll ls 列出当文件夹下 所以文件 3. cd ./xx 进入 xx 文件夹 4. vim vi xxx 进入 xx文件的 编辑模式. i 开始编辑 e ...