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 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完全体的更多相关文章
- Unity Object Pool
using System.Collections; using System.Collections.Generic; using UnityEngine; [System.Serializable] ...
- 设计模式之美:Object Pool(对象池)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...
- Object Pool
设计模式之美:Object Pool(对象池) 索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 意图 运用对象池化 ...
- .NET Core中Object Pool的简单使用
前言 复用,是一个重要的话题,也是我们日常开发中经常遇到的,不可避免的问题. 举个最为简单,大家最为熟悉的例子,数据库连接池,就是复用数据库连接. 那么复用的意义在那里呢? 简单来说就是减少不必要的资 ...
- 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 ...
- Object Pool 对象池的C++11使用(转)
很多系统对资源的访问快捷性及可预测性有严格要求,列入包括网络连接.对象实例.线程和内存.而且还要求解决方案可扩展,能应付存在大量资源的情形. object pool针对特定类型的对象循环利用,这些对象 ...
- 对象池模式(Object Pool Pattern)
本文节选自<设计模式就该这样学> 1 对象池模式的定义 对象池模式(Object Pool Pattern),是创建型设计模式的一种,将对象预先创建并初始化后放入对象池中,对象提供者就能利 ...
- [译]Unity3D内存管理——对象池(Object Pool)
原文地址:C# Memory Management for Unity Developers (part 3 of 3), 其实从原文标题可以看出,这是一系列文章中的第三篇,前两篇讲解了从C#语言本身 ...
- Java小对象的解决之道——对象池(Object Pool)的设计与应用
一.概述 面向对象编程是软件开发中的一项利器,现已经成为大多数编程人员的编程思路.很多高级计算机语言也对这种编程模式提供了很好的支持,例如C++.Object Pascal.Java等.曾经有大量的软 ...
随机推荐
- IDE 、SATA、SCSI 的区别
http://chuanwang66.iteye.com/blog/1134784 IDE IDE的英文全称为“Integrated Drive Electronics”,即“电子集成驱动器”,它的 ...
- BeanShell断言(一)
在beanShell中直接可以调用的变量,无需加前缀. 1.log 打印日志 log.info(“在控制台打印日志”); 2.SampleResult 获取SampleResult对象,可以通过这个对 ...
- 图片放大功能如何做?jquery实现
花了很长时间撸了个网站,观点,其中需要一个图片放大功能,网上找了半天发现都没有中意的,最后无奈之下自己写了一个,演示地址,演示图片: 自我感觉效果还不错,现在分享开来给大家看看,哪里不好还请多多指教, ...
- Xamarin.Android 怎么定义一个按钮和返回键功能一样回到上一个界面
https://zhidao.baidu.com/question/570934367.html页面之间的跳转有startActivity 和startActivityForResult两种,star ...
- C# 全选中数字文本框内容
/// <summary> /// 全选中数字文本框内容 /// </summary> /// <param name=&quo ...
- Android View的事件冲突
上一篇博客讨论了一下view中的事件分发,既然存在事件分发的过程,那么也就可能存在着冲突.常见的由以下三种形式的冲突.(外面叫做OuterViewGroup,包裹在里面的叫做InnerViewGrou ...
- Scrum And Teamwork
Scrum Learning 概念 Scrum是迭代式增量软件开发过程,通常用于敏捷软件开发.Scrum包括了一系列实践和预定义角色的过程骨架.Scrum中的主要角色包括同项目经理类似的Scrum主管 ...
- mysql commit 和 rollback
转自:http://blog.csdn.net/ying_593254979/article/details/12134629 SQL 语言类型 从功能上划分,SQL 语言可以分为DDL,DML和DC ...
- Gulp自动化构建工具的简单使用
相关网站 gulp官方网址:http://gulpjs.com gulp中文网站:http://www.gulpjs.com.cn/ gulp插件地址:http://gulpjs.com/plugin ...
- docker:(3)docker容器挂载宿主主机目录
有一项重要的参数 -v 目录挂载,就是让容器内部目录和宿主主机目录关联起来,这样就可以直接操作宿主主机目录而不用再操作具体容器了 比如在2中,我们要发布一个war包,是通过 sudo docker c ...