很多时候我们对于物体(比如弓箭)大量的生成与销毁,这个时候可以把弓箭放在内存池中进行管理,加快体验。自己Copy了一个简易版的。

一、代码

GameObjectPoolManager.cs

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text; // A general pool object for reusable game objects.
//
// It supports spawning and unspawning game objects that are
// instantiated from a common prefab. Can be used preallocate
// objects to avoid calls to Instantiate during gameplay. Can
// also create objects on demand (which it does if no objects
// are available in the pool).
public class GameObjectPoolManager { public GameObject parent; // The prefab that the game objects will be instantiated from.
private GameObject prefab;

// The list of available game objects (initially empty by default).
private Stack<GameObject> available; // The list of all game objects created thus far (used for efficiently
// unspawning all of them at once, see UnspawnAll).
private List<GameObject> all; // An optional function that will be called whenever a new object is instantiated.
// The newly instantiated object is passed to it, which allows users of the pool
// to do custom initialization.
private Callback<GameObject> initializeFunction; private Callback<GameObject> destroyFunction; //// Indicates whether the pool's game objects should be activated/deactivated
//// recursively (i.e. the game object and all its children) or non-recursively (just the
//// game object).
//private var setActiveRecursively : boolean; // Creates a pool.
// The initialCapacity is used to initialize the .NET collections, and determines
// how much space they pre-allocate behind the scenes. It does not pre-populate the
// collection with game objects. For that, see the PrePopulate function.
// If an initialCapacity that is <= to zero is provided, the pool uses the default
// initial capacities of its internal .NET collections.
public GameObjectPoolManager(GameObject prefab, Callback<GameObject> initializeFunction, Callback<GameObject> destroyFunction)
{
this.prefab = prefab; this.parent = new GameObject(prefab.name + "Pool"); this.available = new Stack<GameObject>();
this.all = new List<GameObject>(); this.initializeFunction = initializeFunction;
this.destroyFunction = destroyFunction;
} // Spawn a game object with the specified position/rotation.
public GameObject Spawn(Vector3 position, Quaternion rotation)
{
GameObject result = null; if (available.Count == 0)
{
// Create an object and initialize it.
result = GameObject.Instantiate(prefab, position, rotation) as GameObject;
result.transform.parent = parent.transform; // Keep track of it.
all.Add(result);
}
else
{
result = available.Pop() as GameObject; // Get the result's transform and reuse for efficiency.
//Calling gameObject.transform is expensive.
var resultTrans = result.transform;
resultTrans.position = position;
resultTrans.rotation = rotation; result.SetActive(true);
} if (initializeFunction != null) initializeFunction(result); return result;
} // Unspawn the provided game object.
// The function is idempotent. Calling it more than once for the same game object is
// safe, since it first checks to see if the provided object is already unspawned.
// Returns true if the unspawn succeeded, false if the object was already unspawned.
public bool Unspawn(GameObject obj)
{ if (!available.Contains(obj))
{
// Make sure we don't insert it twice.
available.Push(obj);
obj.SetActive(false); if (destroyFunction != null) destroyFunction(obj); return true; // Object inserted back in stack.
}
return false; // Object already in stack.
} // Pre-populates the pool with the provided number of game objects.
void PrePopulate(int count){
GameObject[] array = new GameObject[count];
for(var i = 0; i < count; i++){
array[i] = Spawn(Vector3.zero, Quaternion.identity);
//this.SetActive(array[i], false);
}
for(var j = 0; j < count; j++){
Unspawn(array[j]);
}
}

// Unspawns all the game objects created by the pool.
void UnspawnAll()
{
foreach (var item in available)
{
Unspawn(item);
}
}
// Returns the number of active objects.
int GetActiveCount()
{
return all.Count - available.Count;
} // Returns the number of available objects.
int GetAvailableCount(){
return available.Count;
}
}

二、应用

还是用之前的BezierTest.cs的例子

    void Start()
{
arrowPool = new GameObjectPoolManager(arrowPrefab, null, null); //controlPoints = ControlPoints(transform, right);
}
#endregion void Test(bool fireRight)
{
Transform end = fireRight ? right : left; ///在中心点生成弓箭
GameObject curArrow = arrowPool.Spawn(transform.position, Quaternion.Euler(Vector3.zero)); ///计算LookTarget的点 与 贝塞尔曲线的第三个控制点
Vector3[] points = Re_LookTarget_MiddlePerpendicularPoint(curArrow.transform, end); ///初始化发射
ArrowControl arrowControl = curArrow.GetComponent<ArrowControl>();
arrowControl.Init(
points[0],
points[1],
end.position,
3.0f,
delegate()
{
arrowPool.Unspawn(curArrow);
});
}

  

山寨小小军团开发笔记 之 GamePool的更多相关文章

  1. 山寨小小军团开发笔记 之 Arrow Projectile

    好久没怎么更新博客了,今天抽空来一篇,讨论一下弓箭的轨迹生成. 一.原理 弓箭的轨迹本质就是一个数学问题,使用一个 bezier 曲线公式就可以插值生成.得到轨迹后,做一个lookAt就可以了. 二. ...

  2. [开发笔记]-未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...匹配的导出【转载自:酷小孩】

    原文地址:http://www.cnblogs.com/babycool/p/3199158.html 今天打算用VisualStudio2012做一个js效果页面测试的时候,打开VS2012新建项目 ...

  3. EasyUI 开发笔记(二)

    接上篇 :EasyUI 开发笔记(一)  (http://www.cnblogs.com/yiayi/p/3485258.html) 这期就简单介绍下, easyui 的 list 展示, 在easy ...

  4. EasyUI 开发笔记(一)

    由于某些原因,在公司做的后台需要改成类似于Ext.js 形式的后台,主要看好其中的 框架布局,以及tab开页面和弹出式内部窗体. 后来看看,改成EasyUI,较Ext.js 库小很多,也便于公司的初级 ...

  5. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...

  6. Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例

    引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...

  7. Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境

    引言 简单介绍一下Cordova的来历,Cordova的前身叫PhoneGap,自被Adobe收购后交由Apache管理,并将其核心功能开源改名为Cordova.它能让你使用HTML5轻松调用本地AP ...

  8. 开发笔记:基于EntityFramework.Extended用EF实现指定字段的更新

    今天在将一个项目中使用存储过程的遗留代码迁移至新的架构时,遇到了一个问题——如何用EF实现数据库中指定字段的更新(根据UserId更新Users表中的FaceUrl与AvatarUrl字段)? 原先调 ...

  9. Lucene/Solr搜索引擎开发笔记 - 第1章 Solr安装与部署(Jetty篇)

    一.为何开博客写<Lucene/Solr搜索引擎开发笔记> 本人毕业于2011年,2011-2014的三年时间里,在深圳前50强企业工作,从事工业控制领域的机器视觉方向,主要使用语言为C/ ...

随机推荐

  1. SQLServer2005中查询语句的执行顺序

    SQLServer2005中查询语句的执行顺序   --1.from--2.on--3.outer(join)--4.where--5.group by--6.cube|rollup--7.havin ...

  2. xm 命令详解

    xm 命令详解 xm addlabel label dom configfile [policy] xm addlabel label res resource [policy] 增加了名称为labe ...

  3. MongoDB 学习笔记(三)—— 修改器的使用

    通常文档只会有一部分数据要更新,所以使用修改器来操作文档极为高效. 小技巧:了解函数功能,不带括号即可.如:db.blog.update即可查看update函数的具体参数和方法体. $set修改器 & ...

  4. 利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)

    利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)   作者:王可利(Star·星星) 总结: 今天学习的jQ类库的使用,代码重复的比较多需要完善.严格区分大小写,在 $(" ...

  5. 创建表 添加主键 添加列常用SQL语句

    --删除主键 alter table 表名 drop constraint 主键名--添加主键alter table 表名 add constraint 主键名 primary key(字段名1,字段 ...

  6. Android保存图片到系统图库

    最近有些用户反映保存图片之后在系统图库找不到保存的图片,遂决定彻底查看并解决下. Adnroid中保存图片的方法可能有如下两种: 第一种是自己写方法,如下代码: public static File ...

  7. go again

    Introducation (1)How to organize go code (2)How to develope go package (3)How to use go tool How to ...

  8. windows phone 8.1开发笔记之Toast

    Toast(吐司)是wp屏幕上端弹出来的临时通知,他会存在7秒钟的时间,可以快速定位到用户需要的位置(当然是由开发者设置的) 1.创建一个Toast now,需要将你的app设置支持Toast 否则即 ...

  9. jira插件带ui界面和几种方式

    http://localhost:2990/jira/plugins/servlet/issuecrud jira插件带ui界面和几种方式 https://developer.atlassian.co ...

  10. linux php安装zookeeper扩展

    linux php安装zookeeper扩展 tags:php zookeeper linux ext 前言: zookeeper提供很犀利的命名服务,并且集群操作具有原子性,所以在我的多个项目中被采 ...