Unity3D对象池的理解与小例子
来源:互联网 发布:java md5加密解密 编辑:程序博客网 时间:2024/06/08 05:58
最近在学习Unity3D,在制作一个跑酷Demo的时候,发现不停的初始化障碍物和删除障碍物比较卡,后来研究了一下对象池,整了大半天,总算是明白了。现在记录下来,希望能帮助和我一样的新手,如果有不对的地方,还请大牛指正!
本文大部分借鉴了这篇文章
unity3D初识对象池技术
对象池的概念:在激活对象时,它从池中提取。在停用对象时,它放回池中,等待下一个请求。(来自百度);
背景:跑酷游戏,道路上有障碍物,角色身后的障碍物消失,角色前面随机生成障碍物
你所需要的最基本的三样东西:
1、一个池子:用来装你所需的物品,和回收物品;
2、一个取物品的方法;
3、一个放物品的方法;
有这3样东西,你就可以建造对象池了
以下是完整的代码部分,里面有详细的注释
using UnityEngine;using System.Collections;using System.Collections.Generic;public class GameObjectPool : MonoBehaviour {// Use this for initialization //单例模式,如果不知道的话可以百度一下,这里不解释了,因为水平有限 public static GameObjectPool instance; //下面这句是用字典构造你的池子,字典里的String就是坑的名字,每一个坑对应一个GameObject列表 Dictionary<string, List<GameObject>> pool = new Dictionary<string, List<GameObject>>() { };void Start () { instance = this;//单例模式} //从池子得到物体的方法,传递两个参数,你需要得到的物体,和你需要放置的位置 //你所需的物体应该已经制作成预置物体 public GameObject GetPool(GameObject go,Vector3 position) { string key = go.name+"(Clone)";//要去拿东西的坑名字 GameObject rongqi; //你用来取物体的容器; //下面分三种情况来分析 if (pool.ContainsKey(key) && pool[key].Count > 0)//如果坑存在,坑里有东西 { //直接拿走坑里面的第一个 rongqi = pool[key][0]; pool[key].RemoveAt(0);//把第一个位置释放; } else if (pool.ContainsKey(key) && pool[key].Count <= 0)//坑存在,坑里没东西 { //那就直接初始化一个吧 rongqi = Instantiate(go,position,Quaternion.identity) as GameObject; } else //没坑 { //不仅要初始化,还要把坑加上 rongqi = Instantiate(go, position, Quaternion.identity) as GameObject; pool.Add(key, new List<GameObject>() { }); } //调整物体初始状态 rongqi.SetActive(true); //这里我加了一个子物体也显示的代码,你可以不用加 foreach (Transform child in rongqi.transform) { child.gameObject.SetActive(true); } //位置初始化 rongqi.transform.position = position; return rongqi; } //放入池子中的方法 public void IntoPool(GameObject go) { //理论上我们的东西都是从坑里拿出来的,所以放物体进去的时候肯定有他的坑,可以直接放入,不用分情况了 string key = go.name; pool[key].Add(go); go.SetActive(false); } }
</pre><pre name="code" class="csharp">
0 0
- Unity3D对象池的理解与小例子
- Unity3D对象池技术(ObjectPool)小例子
- Comparable与Comparator的两个小例子,简单容易理解
- 对象转型的小例子
- 对象方法的小例子
- Integer.parseInt()与StringTokenizer理解小例子
- 理解面向对象和面向过程区别的一个小例子。
- 接口理解的一个小例子
- 深入理解js的几个小例子
- 快速学习理解javabean的小例子
- 回调函数理解的小例子
- 关于分治的小例子便于理解
- Unity3D用MVC框架思想实现的小例子
- 初学AJAX的小例子,XMLHttpRequest对象
- 使用序列化对象的小例子
- Javascript对象继承的小例子
- 函数对象 及 简单的小例子
- 面向对象设计的小例子
- 简单易懂 MVP 模式
- netstat
- sql select语句中 having和where的区别用法及group by 的几种用法
- Zabbix 3配置邮件报警(一)
- 一个新的Ubuntu怎么搭建好它的环境呢?
- Unity3D对象池的理解与小例子
- [Extjs6]如何使用sencha cmd创建项目及如何启动修改项目创建新的界面
- React Native Android(一)环境搭建
- Dr.Cleaner:清理磁盘和内存,深度卸载应用程序,监控CPU使用率和网络占用情况
- windows启动node程序出现ERROR in %1 is not a valid Win32 application
- java获取当前日期是星期几
- 使用FreeMarker替换JSP的10个理由
- 契约——MTConnect : 目录
- leetcode66: Plus One