Unity中的对象池用法
来源:互联网 发布:淘宝整点聚秒杀神器 编辑:程序博客网 时间:2024/06/01 19:42
在游戏开发过程中,有时候需要频繁的创建相同的游戏物体(例如,子弹、炮弹等),刚开始学习游戏脚本编写时的做法是:反复的Instantiate去实例化游戏物体,当不需要时再Destory掉。然而这种做法是相当耗费资源的。当然,肯定有优化的方法,那就是我们接下来要讲的“对象池”。对象池,顾名思义就是有很多游戏对象的池子,它保存着当前不需要使用到但是却随时会被使用到的游戏对象。
对象池的结构:1、一个池子,用来存放我们的游戏物体 pool
2、一个可以在池子里取物体的公有的静态方法 GetObject
3、一个可以将使用完的物体放回池子的公有静态方法 ReturnObject
接下来就是对上面的三个结构的类型定义了:
1、由于在对象池中可能会有很多种类型的物体,而且每种类型的游戏物体又可能有多个,所以, 我们将pool的类型定义为Dictionary<string, ArrayList>,前面的string为物体的类型,后面的数 组就可以用来保存相同类型的游戏物体了。也就是说,这个Dictonary的实例就是一个对象池。
2、GetObject是从对象池里获取游戏物体的,所以它需要有一个参数(string type)来指定我们要 获取的对象是什么类型的,接着获取到这个对象之后还需要对这个对象的position和rotation进 行初始化,所以还需要两个参数(Vector3 position)和(Quaternion quat)。
3、ReturnObject是把我们使用完的对象放回对象池中,所以我们只需要一个参数,即当前要放入 对象池的物体。
说了那么多,下面直接上代码:
<span style="font-size:24px;">using UnityEngine;using System.Collections;using System.Collections.Generic;public class ObjectPool : MonoBehaviour{ private static Transform hang; //物体从对象池中取出来后挂在这个游戏物体下 private static Transform poolTransform; //对象池 void Start() { hang = GameObject.FindGameObjectWithTag("hang").transform; poolTransform = transform; } //这个Dictionary就是我们所说的对象池的实质了,它就是管理这些池子里的物体的 private static Dictionary<string, ArrayList> pool = new Dictionary<string, ArrayList> { { "Ball", new ArrayList() } //这里的Ball就是我自己定义的类型,可以再继续初<span style="white-space:pre"></span>//始化来保存多种类型的游戏物体 }; //从池子里获取游戏物体 public static GameObject GetObject(string type, Vector3 positon, Quaternion quat) { GameObject o = null; ArrayList array = pool[type] as ArrayList; if (array.Count > 0) { o = array[0] as GameObject; array.RemoveAt(0); } else { o = Instantiate(Resources.Load("Prefabs/" + type), positon, quat) as GameObject; } o.SetActive(true); o.name = type; o.transform.localPosition = positon; o.transform.localRotation = quat; o.transform.parent = hang; return o; } //把使用完的游戏物体放回池子中 public static void ReturnObject(GameObject o) { ArrayList array = pool[o.name] as ArrayList; array.Add(o); o.transform.parent = poolTransform; o.SetActive(false); }}</span>这样就可以当我们要使用一个对象时直接使用 ObjectPool.GetObject去对象池取,而使用完一个对象之后就再使用ObjectPool.ReturnObject将对象放回池子中。
- Unity中的对象池用法
- Unity中的通用对象池
- Unity中的通用对象池
- 关于unity对象池的用法
- Unity编程标准导引-3.4 Unity中的对象池
- Unity编程标准导引-3.4 Unity中的对象池
- Unity编程标准导引-3.4 Unity中的对象池
- Unity编程标准导引-3.4 Unity中的对象池
- Unity编程标准导引-3.4 Unity中的对象池
- Unity编程标准导引-3.4 Unity中的对象池
- Unity编程标准导引-3.4 Unity中的对象池
- Unity游戏开发中的对象池
- Unity中的SendMessage的用法
- [Unity优化]对象池
- unity中对象池
- Unity ----- 对象池GameObjectPool
- Unity 对象池
- 【Unity 教程】对象池
- jdbc 链接数据库工具类
- linux-ftp-安装
- HTTP Request的Get、Post的区别
- 查看正在执行中的SQL
- elipse下python插件安装及使用
- Unity中的对象池用法
- 使用缓冲流(处理流)为什么速度会加快?
- BaseDaoImpl
- 调用jar包外配置文件
- PHP + Ice安装配置
- Android sqlite 数据库操作
- 追踪调用
- 用表情开发“俏皮”编程语言
- MAT分析JAVA内存问题