• 对象池2(方法功能)Pools


    对象池Pools(主要调用方法功能)

    namespace kernal

    {

        public class Pools : MonoBehaviour

        {

            [HideInInspector]

            public Transform ThisGameObjectPosition;            //本类挂载游戏对象位置             

            public List<PoolOption> PoolOptionArrayLib = new List<PoolOption>();

             //“单模缓冲池”集合容器

            public bool IsUsedTime = false;                  //是否用“时间戳”

            void Awake()

            {

                PoolManager.Add(this);                                                 //加入“多模复合池”管理器

                ThisGameObjectPosition = transform;

                //预加载

                PreLoadGameObject();

            }

            void Start()

            {

                //开始时间戳处理

                if (IsUsedTime)

                {

                    InvokeRepeating("ProcessGameObject_NameTime", 1F, 10F);

                }

            }

            // 时间戳处理:每间隔10秒种,对所有正在使用的活动状态游戏对象的时间戳减去10秒,活动状态的游戏对象名称的时间戳如果小于等于0,则进入禁用状态,重新进入活动状态的游戏对象,获得预先设定的存活时间写入对象名称的时间戳中。(时间的判断根据命名来判断)

            void ProcessGameObject_NameTime()

            {

                //循环体为定义的“种类”数量

                for (int i = 0; i < PoolOptionArrayLib.Count; i++)

                {

                    PoolOption opt = this.PoolOptionArrayLib[i];

              //所有正在使用的活动状态游戏对象的时间戳减去10秒,检查每个活动状态的游戏对象名称的时间戳如果小于等于0,则进入禁用状态

                    opt.AllActiveGameObjectTimeSubtraction();

                }

            }

            public void PreLoadGameObject()      //预加载

            {

                for (int i = 0; i < this.PoolOptionArrayLib.Count; i++)

                {              //“多模”集合

                    PoolOption opt = this.PoolOptionArrayLib[i];   //“单模”集合

                    for (int j = opt.totalCount; j < opt.IntPreLoadNumber; j++)

                    {

                                GameObject obj = opt.PreLoad(opt.Prefab, Vector3.zero, Quaternion.identity);

                        //所有预加载的游戏对象规定为Pool类所挂游戏对象的子对象。

                        obj.transform.parent = ThisGameObjectPosition;

                    }

                }

            }

        //  得到游戏对象,从缓冲池中(“多模”集合) 功能描述: 对指定“预设”在自己的缓冲池中激活一个,且加入自己缓冲池中的"可用激活池",然后再建立一个池对象,且激活预设,再加入自己的缓冲池中的“可用激活池”中。

            public GameObject GetGameObjectByPool(GameObject prefab, Vector3 pos, Quaternion rot)

            {

                GameObject obj = null;

                //循环体为定义的“种类”数量

                for (int i = 0; i < PoolOptionArrayLib.Count; i++)

                {

                    PoolOption opt = this.PoolOptionArrayLib[i];

                    if (opt.Prefab == prefab)

                    {

                        //激活指定“预设”

                        obj = opt.Active(pos, rot);

                        if (obj == null) return null;

                        //所有激活的游戏对象必须是本类所挂空对象的子对象。

                        if (obj.transform.parent != ThisGameObjectPosition)

                        {

                            obj.transform.parent = ThisGameObjectPosition;

                        }

                    }

                }

                return obj;

            }

            // 收回游戏对象(“多模”集合)

            public void RecoverGameObjectToPools(GameObject instance)

            {

                for (int i = 0; i < this.PoolOptionArrayLib.Count; i++)

                {

                    PoolOption opt = this.PoolOptionArrayLib[i];

                    //检查自己的每一类“池”中是否包含指定的“预设”对象。

                    if (opt.ActiveGameObjectArray.Contains(instance))

                    {

                        if (instance.transform.parent != ThisGameObjectPosition)

                            instance.transform.parent = ThisGameObjectPosition;

                        //特定“池”回收这个指定的对象。

                        opt.Deactive(instance);

                    }

                }

            }

            // 销毁无用的对象(“多模”集合)

            public void DestoryUnused()

            {

                for (int i = 0; i < this.PoolOptionArrayLib.Count; i++)

                {

                    PoolOption opt = this.PoolOptionArrayLib[i];

                    opt.ClearUpUnused();

                }

            }

            // 销毁指定数量的游戏对象

            public void DestoryPrefabCount(GameObject prefab, int count)

            {

                for (int i = 0; i < this.PoolOptionArrayLib.Count; i++)

                {

                    PoolOption opt = this.PoolOptionArrayLib[i];

                    if (opt.Prefab == prefab)

                    {

                        opt.DestoryCount(count);

                        return;

                    }

                }

            }

            // 当本脚本所挂载的游戏对象销毁时候,清空所有集合内全部数据

            public void OnDestroy()

            {

                //停止时间戳的检查

                if (IsUsedTime)

                {

                    CancelInvoke("ProcessGameObject_NameTime");

                }

                for (int i = 0; i < this.PoolOptionArrayLib.Count; i++)

                {

                    PoolOption opt = this.PoolOptionArrayLib[i];

                    opt.ClearAllArray();

                }

            }

    }

    }

    注:这段对象池代码是对象池的调用实现功能的人方法,主要调用基础的实现方式,加载、显示、隐藏、时间控制等返回给上层调用的地方。

    支持个人观看使用,如商用或转载,请告知! -----萧朗(QQ:453929789 Email:xiaolang_xl@sina.com)
  • 相关阅读:
    最新国家标准下载(2020-7-31)
    SL/T 264-2020 水利水电工程岩石试验规程
    SH/T 3082-2019 石油化工仪表供电设计规范
    GB/T 4780-2020 汽车车身术语
    Java——冒泡排序
    JSP处理XML数据
    JSP标准标签库(JSTL)
    千锤百炼软工第十九天
    千锤百炼软工第十八天
    千锤百炼软工第十七天
  • 原文地址:https://www.cnblogs.com/XiaoLang0/p/9636597.html
Copyright © 2020-2023  润新知