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对象池的更多相关文章

  1. unity3d对象池的使用

    说对象池之前首先来看看单例类和单例脚本的区别.这里有介绍 http://blog.csdn.net/lzhq1982/article/details/12649281 使用对象池的好处是不用每次都创建 ...

  2. Unity3D 对象池思想 在游戏开发中的运用

    分类:U3D 1.在王者荣耀中,每30秒小兵会出现一波,出现之后会被敌方玩家或敌方小兵销毁,一局游戏下来,小兵会被创建多次,同时也会被销毁,在游戏中,这种频繁的创建和销毁游戏对象是很损耗性能的.在游戏 ...

  3. Unity3D 基于预设(Prefab)的泛型对象池实现

    背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样 ...

  4. 游戏开发设计模式之对象池模式(unity3d 示例实现)

    前篇:游戏开发设计模式之命令模式(unity3d 示例实现) 博主才学尚浅,难免会有错误,尤其是设计模式这种极富禅意且需要大量经验的东西,如果哪里书写错误或有遗漏,还请各位前辈指正. 原理:从一个固定 ...

  5. [译]Unity3D内存管理——对象池(Object Pool)

    原文地址:C# Memory Management for Unity Developers (part 3 of 3), 其实从原文标题可以看出,这是一系列文章中的第三篇,前两篇讲解了从C#语言本身 ...

  6. Unity3D 游戏开发构架篇 —— 动态大场景生成 = 区域加载+对象池管理

    项目做一个类似无尽模式的场景,想了一想,其实方法很简单,做一个相关的总结. 主要先谈一谈构架,后期附上代码. 一.区域加载 其实无尽场景的实现很简单,因为屏幕限制,那么不论何时何地,我们只能看到自己的 ...

  7. 设计模式之美:Object Pool(对象池)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...

  8. Egret中的对象池ObjectPool

    为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...

  9. 对象池与.net—从一个内存池实现说起

    本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...

随机推荐

  1. Java问题解决:springboot启动出现-Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package

    参考资料: http://www.mamicode.com/info-detail-2101273.html https://blog.csdn.net/u012834750/article/deta ...

  2. 集训队日常训练20181201 E 1005 : 小蝌蚪

    时间限制(普通/Java):500MS/1500MS     内存限制:65536KByte总提交: 25            测试通过:5 描述 有 n 个装着小蝌蚪的水缸排成一排,你拥有一个无限 ...

  3. LineRenderer实现一个画线组件

    using System; using UnityEngine; class UILine { GameObject targetObj; LineRenderer lineRenderer; //L ...

  4. iframe之间的postMessage传参

    1.传参 function IframeClose() { var obj = {method: "iframeClose"}; window.parent.postMessage ...

  5. 8.2 GOF设计模式一: 单实例模式 SingleTon

    GOF设计模式一: 单实例模式 SingleTon  整个美国,只有一个“现任美国总统”  比如,在学校,“老师”,有数百个:“校长”,只有一个  系统运行时,如何保证某个类只允许实例化一个对象 ...

  6. 【Java】【13】两个double类型比较大小

    /** * @return >0,第一位数大 */ public static int compare(double double1, double double2) { BigDecimal ...

  7. springcloud-zuul路由网关

    路由网关(zuul) 在微服务架构中,需要多个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能 路由.配置管理等,由这个基础组件相互协作,共同组建了一个简单的微服务系统.一个简 ...

  8. 队列添加对象后,所有都变成相同的(bug)

    代码背景: 定义全局变量 private object currentObj=new object(); ;i<objectList.count;i++) { currentObj=object ...

  9. 微信小程序页面跳转导航wx.navigateTo和wx.redirectTo

    }) wx.redirectTo(OBJECT) 关闭当前页面,跳转到应用内的某个页面. 还是用上面的三张图示作为例子,当使用wx.redirctTo接口跳转页面时,原来的页面将被删除掉,当然,这是小 ...

  10. Monkey 生成报告方法

    Monkey 命令简介 Monkey 是 SDK 中附带的一个小工具,用来进行压力测试.进行压力测试之前,首先要进行安装 SDK ,并配置环境变量: 1.安装 Java JDK 并配置环境变量(计算机 ...