Unity3d对象池

Singleton.cs

12345678910111213
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

1234567891011121314151617181920212223
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

12345678910
using UnityEngine;/// <summary>/// 对象池接口/// </summary>public interface IReusable{    //对象从对象池实例化的回调    void OnSpawned();    //对象返回对象池后的回调    void OnUnSpawned();}

PrefabType.cs

12345
public enum PrefabType{    None = 0,    Effects = 1,    Roles = 2,}

ResourcesPath.cs

123456789101112131415161718192021
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

12345678910111213141516171819
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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
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

1234567891011121314151617181920212223
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);    }

}

原文地址:https://www.cnblogs.com/huwenya/p/10622556.html

时间: 2024-10-06 00:53:45

Unity3d对象池的相关文章

unity3d对象池的使用

说对象池之前首先来看看单例类和单例脚本的区别.这里有介绍 http://blog.csdn.net/lzhq1982/article/details/12649281 使用对象池的好处是不用每次都创建对象.销毁在创建,比如子弹的发射,当创建好的子弹.可以在使用后保存到对象池里面.当用的时候.直接从对象池中取即可 这里随便举个列子 鼠标左键单击发射蓝色球.右键发射红色球 Main Camera挂载Fire.cs脚本 GameObject挂载单列脚本ObjectPools.cs Fire.cs代码

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

分类:U3D 1.在王者荣耀中,每30秒小兵会出现一波,出现之后会被敌方玩家或敌方小兵销毁,一局游戏下来,小兵会被创建多次,同时也会被销毁,在游戏中,这种频繁的创建和销毁游戏对象是很损耗性能的.在游戏开发过程中,我们会频繁的创建对象和销毁对象,为了提高游戏性能,我们就要用到对象池思想了. 2.在射击游戏中,会频繁的销毁和创建子弹,这就可以用对象池思想了. 什么是对象池? 池,想到了水池,水池是水的集合.所以,对象池就是对象的集合,我们可以初步的按照这种想法来理解对象池.使用原理的话就是,我们在创

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

从一个简单的对象池类开始说起 对象池背后的理念其实是非常简单的.我们将对象存储在一个池子中,当需要时在再次使用,而不是每次都实例化一个新的对象.池的最重要的特性,也就是对象池设计模式的本质是允许我们获取一个“新的”对象而不管它真的是一个新的对象还是循环使用的对象.该模式可以用以下简单的几行代码实现: public class ObjectPool<T> where T : class, new() { private Stack<T> m_objectStack = new Sta

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

背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样的对象池才是好的呢,我们发现通用的对象池未必适应所有的环境,比如基于UI的局部(从某个Scene,到某个Dialog)对象池,范围不同,需要的对象池就有不同的要求.本文就是介绍一种基于预设(Prefab)的局部UI对象池. 通用信息提示窗口的实现http://www.manew.com/thread

《Unity3D》通过对象池模式,管理场景中的元素

池管理类有啥用? 在游戏场景中,我们有时候会需要复用一些游戏物体,比如常见的子弹.子弹碰撞类,某些情况下,怪物也可以使用池管理,UI部分比如:血条.文字等等 这些元素共同的特性是:存在固定生命周期,使用比较频繁,场景中大量使用. 所以,我们就通过池管理思路,在游戏初始化的时候,生成一个初始的池,存放我们要复用的元素, 当要用到时,从池中取出:生命周期结束,放回到池中. 代码 这个池的参数有两个:1池中存放的元素 2 池的初始容量(如果池不够了,则会按照这个容量进行扩展) 代码如下 using S

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

前篇:游戏开发设计模式之命令模式(unity3d 示例实现) 博主才学尚浅,难免会有错误,尤其是设计模式这种极富禅意且需要大量经验的东西,如果哪里书写错误或有遗漏,还请各位前辈指正. 原理:从一个固定的池中重用对象,来提升性能和内存的使用,而不是一个一个的分配内存在释放它们.当你需要创造大量重复的对象,而且经常使用这些对象,你就要考虑使用对象池了,因为反复创建销毁就是一个内存反复分配与释放的过程,很容易产生内存碎片.在主机和移动端与PC相比内存稀缺,我们都希望游戏能够更加稳定,而不能有效的管理内

Unity3D中对象池的实现

在Unity中常常会遇到需要重复创建,销毁某些物体的情况,比如fps类游戏中的子弹,rpg类游戏中的小怪等等,如果直接使用Instantiate和Destroy的话,会浪费系统的资源,而使用对象池则能够节省下这些浪费. 这里使用一个重复利用子弹的进行发射的简单场景来演示对象池. 首先需要一个在场景中创建一个Cube,充当子弹. 然后在Assets目录下创建Resources文件夹,在Cube上添加上刚体,取消重力后,将Cube拖入Resources文件夹内作为一个预设,在场景中删除这个Cube.

unity3D初识对象池技术

对象池概念:用来优化游戏,提升游戏性能,如飞机大战 ,当触及到大量的物体需要不断的重新的被创建的时候,这个时候就适合用到对象池. 下面我会写一个例子更详细的来说明下这个对象池的用法: 对象池主要有2个方法 1:从池里去找东西 2:往池里放东西 这里我是写了一个打砖块的例子,后续我会把整个游戏的代码分享出来,里面包含一个拿和一个放的方法. using UnityEngine; using System.Collections; using System.Collections.Generic; /

整数对象池

Python 的内建对象存放在源代码的Objects目录下.intobject.c用于整数对象 在 Python 中,整数分为小整数对象和大整数对象 小整数对象 由于数值较小的整数对象在内存中会很频繁地使用,如果每次都向内存申请空间.请求释放,会严重影响 Python 的性能.好在 整数对象 属于不可变对象,可以被共享而不会被修改导致问题,所以为 小整数对象 划定一个范围,即小整数对象池,在Python运行时初始化并创建范围内的所有整数,这个范围内的 整数对象是被共享的,即一次创建,多次共享引用