Unity3d对象池
Singleton.cs
1
2
3
4
5
6
7
8
9
10
11
12
13 using UnityEngine;
/// <summary>
/// 单例模版类
/// </summary>
public class Singleton<T> where T : new() {
private static readonly T instance = new T(); public static T Instance{
get{
return instance;
}
}
}
MonoSingleton.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 using UnityEngine;
/// <summary>
/// 组建单例模版
/// </summary>
public class MonoSingleten<T> : MonoBehaviour where T : MonoBehaviour{
private static T instance;
public static T Instance{
get{
if (instance == null){
GameObject go = new GameObject(typeof(T).Name);
instance = go.AddComponent<T>();
}
return instance;
}
set {
instance = value;
}
} protected virtual void Awake(){
Instance = this as T;
}
}
IReusable.cs
1
2
3
4
5
6
7
8
9
10 using UnityEngine;
/// <summary>
/// 对象池接口
/// </summary>
public interface IReusable{
//对象从对象池实例化的回调
void OnSpawned();
//对象返回对象池后的回调
void OnUnSpawned();
}
PrefabType.cs
1
2
3
4
5 public enum PrefabType{
None = 0,
Effects = 1,
Roles = 2,
}
ResourcesPath.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 using UnityEngine;
/// <summary>
/// 资源路径
/// </summary>
public class ResourcesPath {
public const string prefabRoles = "Prefabs/Roles/";
public const string prefabEffects = "Prefabs/Effects/"; public static string GetPath(PrefabType type, string name){
string path = string.Empty;
switch(type){
case PrefabType.Effects:
path = ResourcesPath.prefabEffects + name;
break;
case PrefabType.Roles:
path = ResourcesPath.prefabRoles + name;
break;
}
return path;
}
}
ResourceFactory.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 using System.Collections;
using System.Collections.Generic;
using UnityEngine; /// <summary>
/// 资源工厂
/// </summary>
public class ResourceFactory : Singleton<ResourceFactory> {
/// <summary>
/// 加载资源
/// </summary>
/// <returns>The load.</returns>
/// <param name="path">Path.</param>
/// <typeparam name="T">The 1st type parameter.</typeparam>
public T Load<T>(string path) where T : Object{
T res = Resources.Load<T>(path);
return res;
}
}
ObjectPoolMananger.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 using System.Collections;
using System.Collections.Generic;
using UnityEngine; /// <summary>
/// 对象池管理器
/// </summary>
public class ObjectPoolMananger : MonoSingleten<ObjectPoolMananger> {
private Dictionary<string, ObjectPool> mPools = new Dictionary<string, ObjectPool>(); //从对象池取出对象
public GameObject Spawn(PrefabType type, string name, Vector3 pos = default(Vector3), Quaternion rotation = default(Quaternion), Transform parent = null){
ObjectPool pool = null;
if (!mPools.ContainsKey(name)){
//创建对象池
RegisterPoll(type, name);
}
pool = mPools[name];
//从对象池中取出一个物体
GameObject obj = pool.Spawn(); obj.transform.SetParent(parent);
obj.transform.localPosition = pos;
obj.transform.localRotation = rotation;
return obj; } /// <summary>
/// 对象池回收物体
/// </summary>
/// <param name="obj">Object.</param>
public void UnSpawn(GameObject obj){
foreach(ObjectPool pool in mPools.Values){
if (pool.Contains(obj)){
pool.UnSpawn(obj);
return ;
}
}
Destroy(obj);
} /// <summary>
/// 回收所有物体
/// </summary>
public void UnSpwanAll(){
foreach(ObjectPool pool in mPools.Values){
pool.UnSpawnAll();
}
}
private void RegisterPoll(PrefabType type, string name){
string path = ResourcesPath.GetPath(type, name);
GameObject prefab = ResourceFactory.Instance.Load<GameObject>(path);
ObjectPool pool = new ObjectPool(prefab);
mPools.Add(name, pool);
}
}
ObjectPool.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 对象池类
/// </summary>
public class ObjectPool{
//预制体
private GameObject mPrefab;
//对象池
private List<GameObject> objectlist = new List<GameObject>(); //构造方法
public ObjectPool(GameObject prefab){
this.mPrefab = prefab;
} /// <summary>
/// 取出物体
/// </summary>
/// <returns>The spawn.</returns>
public GameObject Spawn(){
GameObject obj = null;
for (int i = 0; i < objectlist.Count; i++){
if (!objectlist[i].activeSelf){//如果有物体隐藏
obj = objectlist[i];
break;
}
}
if (obj == null){
obj = GameObject.Instantiate(mPrefab);
objectlist.Add(obj);
}
obj.SetActive(true); //获取对象池接口
IReusable reusable = obj.GetComponent<IReusable>();
if (reusable != null){
reusable.OnSpawned();
}
return obj;
} /// <summary>
/// 回收物体
/// </summary>
/// <param name="obj">Object.</param>
public void UnSpawn(GameObject obj){
obj.SetActive(false);
IReusable reusable = obj.GetComponent<IReusable>();
if (reusable != null){
reusable.OnUnSpawned();
}
} public void UnSpawnAll() {
foreach (GameObject obj in objectlist){
obj.SetActive(false);
IReusable reusable = obj.GetComponent<IReusable>();
if (reusable != null){
reusable.OnUnSpawned();
}
}
} /// <summary>
/// 判断物体是否存在
/// </summary>
/// <returns>The contains.</returns>
/// <param name="obj">Object.</param>
public bool Contains(GameObject obj){
return objectlist.Contains(obj);
}
}
DestoryObjectPool.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 对象池销毁
/// </summary>
public class DestoryObjectPool : MonoBehaviour, IReusable {
public float mDestoryTime = 0.1f; public void OnSpawned()
{
Invoke("UnSpawn", mDestoryTime);
} public void OnUnSpawned()
{
} private void UnSpawn(){
ObjectPoolMananger.Instance.UnSpawn(gameObject);
} }
Unity3d对象池的更多相关文章
- unity3d对象池的使用
说对象池之前首先来看看单例类和单例脚本的区别.这里有介绍 http://blog.csdn.net/lzhq1982/article/details/12649281 使用对象池的好处是不用每次都创建 ...
- Unity3D 对象池思想 在游戏开发中的运用
分类:U3D 1.在王者荣耀中,每30秒小兵会出现一波,出现之后会被敌方玩家或敌方小兵销毁,一局游戏下来,小兵会被创建多次,同时也会被销毁,在游戏中,这种频繁的创建和销毁游戏对象是很损耗性能的.在游戏 ...
- Unity3D 基于预设(Prefab)的泛型对象池实现
背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样 ...
- 游戏开发设计模式之对象池模式(unity3d 示例实现)
前篇:游戏开发设计模式之命令模式(unity3d 示例实现) 博主才学尚浅,难免会有错误,尤其是设计模式这种极富禅意且需要大量经验的东西,如果哪里书写错误或有遗漏,还请各位前辈指正. 原理:从一个固定 ...
- [译]Unity3D内存管理——对象池(Object Pool)
原文地址:C# Memory Management for Unity Developers (part 3 of 3), 其实从原文标题可以看出,这是一系列文章中的第三篇,前两篇讲解了从C#语言本身 ...
- Unity3D 游戏开发构架篇 —— 动态大场景生成 = 区域加载+对象池管理
项目做一个类似无尽模式的场景,想了一想,其实方法很简单,做一个相关的总结. 主要先谈一谈构架,后期附上代码. 一.区域加载 其实无尽场景的实现很简单,因为屏幕限制,那么不论何时何地,我们只能看到自己的 ...
- 设计模式之美:Object Pool(对象池)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...
- Egret中的对象池ObjectPool
为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...
- 对象池与.net—从一个内存池实现说起
本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...
随机推荐
- 51nod 1405 树的距离之和 树形dp
1405 树的距离之和 基准时间限制:1 秒 空间限制:131072 KB 收藏 关注 给定一棵无根树,假设它有n个节点,节点编号从1到n, 求任意两点之间的距离(最短路径)之和. Input ...
- rtf乱码解决办法
首先,阐述下rtf,富文本格式文档,目前常用来做模板: 我遇到的问题是rtf中替换后的文本显示是正常的,rtf直接转pdf就不正常了,通过notpad++ 打开后发现rtf本身内容编码是我没有见过的( ...
- HotSpot虚拟机对象探秘-笔记
学习目的:探讨HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程. 1.对象的创建 虚拟机在执行到一条new指令时,先要检查指令的参数(将要实例化的类)是否已经被加载.解析.初始化过,如果 ...
- web api 安全
这方面的文章已经有很多了,我只是记录一下自己在项目中应用的具体实现 客户端 DateTime t = DateTime.Now; long timeStamp = SignHelper.Convert ...
- MemSQL Start[c]UP 2.0 - Round 1E. Three strings
题意:给3个字符串,问从1到min(l1,l2,l3)的长度的子串,找到从该位置长度为l,三个子串相同的三元组的个数 题解:把3个子串用分隔符串起来.然后分开统计每个节点在三个串中出现次数.最后乘起来 ...
- Spring框架中的定时器 使用和配置
Spring框架中的定时器 如何使用和配置 转载自:<Spring框架中的定时器 如何使用和配置>https://www.cnblogs.com/longqingyang/p/554543 ...
- windows和linux环境下keras的模型框架可视化
1.简介 keras提供了模型可视化模块,下面讲解下安装教程和简易教程. 2.安装教程 2.1windows环境下的安装 2.1.1安装指定模块 pip install pydot-ng pip in ...
- Hive分区表的导入与导出
最近在做一个小任务,将一个CDH平台中Hive的部分数据同步到另一个平台中.毕竟我也刚开始工作,在正式开始做之前,首先进行了一段时间的练习,下面的内容就是练习时写的文档中的内容.如果哪里有错误或者疏漏 ...
- js--map函数的使用
map( ) 属于操作数组的方法. 包含三个参数,item,index,arr 看一份代码: let arr = [ {title:'aaa',hot:true}, {title:'fff',hot ...
- 浅谈C++的智能指针
我们使用智能指针来自动运行管理内存,避免对原始指针的使用不当而造成内存泄漏. ------------------------------------------------------------- ...