Unity 对象池 生产 保存
Unity对象池主要是保存那些常用的物体,避免他们在不断销毁和创造中损坏性能。
主要思路为:创造物体时,判断是否存在,如果存在则调用并使其显示。如果不存在则创造一个新的。
当销毁时,调用协程延时隐藏物体。
// <summary>
/// 对象池
/// </summary>
public class GameObjectPool : MonoSingleton<GameObjectPool>
{
//内部容器,用于存入缓存的对象
private Dictionary<string, List<GameObject>> cache = new Dictionary<string, List<GameObject>>(); /// <summary>
/// 生产物体
/// </summary>
public GameObject CreateObject(string key, GameObject go, Vector3 position, Quaternion quaternion)
{
//有:key对应列表中有没有可用(非活动状态)的物体
var tempGo = FindUsable(key);
if (tempGo != null)
{
//有:设置后返回可用物体
tempGo.transform.position = position;
tempGo.transform.rotation = quaternion;
tempGo.SetActive(true);
}
else
{
//没有:(场景中没有,内存中也没有)创建物体后添加cache,
tempGo = Instantiate(go, position, quaternion) as GameObject;
Add(key, tempGo);
}
return tempGo;
} /// <summary>
/// 将对象放入缓存
/// </summary>
private void Add(string key, GameObject newObject)
{
//创建key,创建key的列表
if (!cache.ContainsKey(key))
cache.Add(key, new List<GameObject>());
cache[key].Add(newObject);
} /// <summary>
/// 找对应key的列表中没有没可用的物体
/// </summary>
private GameObject FindUsable(string key)
{
//有Key: 找非活动状态的物体
if (cache.ContainsKey(key))
{
return cache[key].Find(p => !p.activeSelf);
}
return null;
} /// <summary>
/// 即时回收
/// </summary>
/// <param name="go">要回收的对象</param>
public void CollectObject(GameObject go)
{
go.SetActive(false);
} /// <summary>
/// 延时回收
/// </summary>
/// <param name="go">要回收的对象</param>
/// <param name="delay">延时时长</param>
public void CollectObject(GameObject go,float delay)
{
//开启协程
StartCoroutine(Delay(go,delay));
} /// <summary>
/// 用于回收的协程方法
/// </summary>
public IEnumerator Delay(GameObject go,float delay)
{
//等待delay之后,
yield return new WaitForSeconds(delay);
//调用即时回收
CollectObject(go);
} /// <summary>
/// 将key对象的缓存物体从池中清除(销毁)
/// </summary>
/// <param name="key"></param>
public void Clear(string key)
{
if(cache.ContainsKey(key))
{
while (cache[key].Count > )
{
//销毁每个物体
Destroy(cache[key][]);
//删除列表中的空引用
cache[key].RemoveAt();
}
//删除key
cache.Remove(key);
}
} /// <summary>
/// 清空池中物体
/// </summary>
public void ClearAll()
{ //遍历所有的key
List<string> keys = new List<string>(cache.Keys);
//逐个清除
while (cache.Count > )
{
Clear(keys[]);
keys.RemoveAt();
}
}
}
Unity 对象池 生产 保存的更多相关文章
- Unity——对象池管理
Unity对象池管理 一.Demo展示 二.逻辑 在游戏中会出现大量重复的物体需要频繁的创建和销毁:比如子弹,敌人,成就列表的格子等: 频繁的创建删除物体会造成很大的开销,像这种大量创建重复且非持续性 ...
- Unity ----- 对象池GameObjectPool
孙广东 2014.6.28 非常早之前看到的外国文章,认为不错,分享一下. 对象池在AssetStore中也是有非常多插件的,可是有些重了.自己写一个轻量的岂不是非常好. 当你须要创建大量某种类型对象 ...
- Unity 对象池的使用
在游戏开发过程中,我们经常会遇到游戏发布后,测试时玩着玩着明显的感觉到有卡顿现象.出现这种现象的有两个原因:一是游戏优化的不够好或者游戏逻辑本身设计的就有问题,二是手机硬件不行.好吧,对于作为程序员的 ...
- Unity对象池的实现
对象池是一个单例类: using System.Collections; using System.Collections.Generic; using UnityEngine; public cla ...
- 游戏设计模式——Unity对象池
对象池这个名字听起来很玄乎,其实就是将一系列需要反复创建和销毁的对象存储在一个看不到的地方,下次用同样的东西时往这里取,类似于一个存放备用物质的仓库. 它的好处就是避免了反复实例化个体的运算,能减少大 ...
- Unity对象池管理
链接: http://www.xuanyusong.com/archives/2925 http://www.xuanyusong.com/archives/2974 https://www.cnbl ...
- Unity实现简单的对象池
一.简介 先说说为什么要使用对象池 在Unity游戏运行时,经常需要生成一些物体,例如子弹.敌人等.虽然Unity中有Instantiate()方法可以使用,但是在某些情况下并不高效.特别是对于那些需 ...
- Java小对象的解决之道——对象池(Object Pool)的设计与应用
一.概述 面向对象编程是软件开发中的一项利器,现已经成为大多数编程人员的编程思路.很多高级计算机语言也对这种编程模式提供了很好的支持,例如C++.Object Pascal.Java等.曾经有大量的软 ...
- Unity中对象池的使用
unity中用到大量重复的物体,例如发射的子弹,可以引入对象池来管理,优化内存. 对象池使用的基本思路是: 将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用.恰当地使用对象池,可以在 ...
随机推荐
- srand() rand() time(0)
标准库<cstdlib>(被包含于<iostream>中)提供两个帮助生成伪随机数的函数: 函数一:int rand(void):从srand (seed)中指定的seed开始 ...
- .net mvc笔记3_Understanding Razor Syntax
Understanding Razor Syntax MVC3新视图引擎的名字叫做Razor.ASP.NET视图引擎处理web页面,寻找包含在服务器端指令的特殊元素.正如我们前面已经提到的,标准的AS ...
- C#对象赋值出现的诡异问题,或许你也遇到过,有待你的解决
前言:今天在代码中,又出现了这个问题,就是对象赋值给一个新的对象时,然后更改新对象中的属性,就会把老对象的值也更改,以前也遇到这个问题,只是没有深究,今天刚好又遇到了此问题,我决定写下来,和大家一起分 ...
- R使用入门
R是一个开源的统计学软件包,用于数据计算,绘图等等用途,看介绍与大数据走得比较近. 入门还是很简单的,安装文件也非常的小. 官网网站,下载对应系统的安装包,55M,比matlab小多了,像操作系统 ...
- 51nod 1239 欧拉函数之和(杜教筛)
[题目链接] https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239 [题目大意] 计算欧拉函数的前缀和 [题解] 我们 ...
- C、C++中引用与指针的区别
1:引用的和指针在概念上的区别 引用是变量的别名,例如 int m; int &n=m; 引用作为一个别名.它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用 ...
- POJ 1037 DP
题目链接: http://poj.org/problem?id=1037 分析: 很有分量的一道DP题!!! (参考于:http://blog.csdn.net/sj13051180/article/ ...
- 对武汉-and-IT软件开发的看法
本编是一个武汉农村娃子,2015年毕业到现在算上实习 差不多快三年的时间了.在软件行业混的也就一般水平,从开心在学校学习的winform+DBHelper 的开发模式,到现在MVC+EF 的开发模式. ...
- Problem B: Excuses, Excuses!
Description Judge Ito is having a problem with people subpoenaed for jury duty giving rather lame ex ...
- [cocos2d-x] 让精灵响应触摸 并把方向旋转到相对应的角度
在cocos2d-x里面 想要把一个精灵从原位置移动到用户所触摸到的点 , 并且把精灵的方向旋转相对应的弧度,可以参考一下我的做法 我这里的精灵是用一条鱼, 用户触摸后鱼就移动到所触摸的点, 并且移 ...