美文网首页
Unity优化之对象池

Unity优化之对象池

作者: 玄策丶 | 来源:发表于2018-07-28 15:21 被阅读0次
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class PoolManager : MonoBehaviour 
{
    public GameObject Obj;                              // 池子里面的对象
    public int InitCapacity;                            // 初始容量

    private List<int> _AvailableIDList;                 // 可用的ID集合
    private Dictionary<int, GameObject> _AllObjDic;     // 池子
    private int _StartID = 0;

    void Start ()
    {
        // 分配空间
        _AvailableIDList = new List<int>(InitCapacity);
        _AllObjDic = new Dictionary<int, GameObject>(InitCapacity);
        // 初始化对象池
        InitPool();
    }//end_Start

    /// <summary>
    /// 初始化对象池
    /// </summary>
    void InitPool()
    {
        int endID = _StartID + InitCapacity;
        for (int i = _StartID; i < endID; i++)
        {
            GameObject newObj = Instantiate(Obj) as GameObject;
            newObj.SetActive(false);
            _AvailableIDList.Add(i);
            _AllObjDic.Add(i, newObj);
        }
        _StartID = endID;
    }

    /// <summary>
    /// 取出一个键值对,e.g.  1001, Obj 代表ID是1001的物体被取到,1001可以在放回池子的时候用到
    /// </summary>
    /// <returns>取出的键值对</returns>
    public KeyValuePair<int, GameObject> PickObj()
    {
        // 如果可用的ID没有了
        if (_AvailableIDList.Count == 0)
        {// 重新初始化池子
            InitPool();
        }
        int id = _AvailableIDList[0];
        _AvailableIDList.Remove(id);
        // 池子里面对应ID的对象显示出来,代表从池子中取出了该对象
        _AllObjDic[id].SetActive(true);
        return new KeyValuePair<int, GameObject>(id, _AllObjDic[id]);
    }

    /// <summary>
    /// 根据ID回收对象到对象池当中
    /// </summary>
    /// <param name="id">对象的ID</param>
    public void RecyleObj(int id)
    {
        // 让池子中的炮弹隐藏起来表示重新放回了缓冲池
        _AllObjDic[id].SetActive(false);
        // 放回池子之后,可用的ID也要添加
        _AvailableIDList.Add(id);
        if (_AllObjDic[id].GetComponent<Rigidbody>())
        {// 让炮弹的速度变为0
            _AllObjDic[id].GetComponent<Rigidbody>().velocity = Vector3.zero;
        }
    }
}

相关文章

  • Unity优化之对象池

  • Unity 学习笔记

    Unity 对象池实现方案:

  • Unity优化 对象池的应用

    我们在做射击类的游戏的时候我们经常会用到子弹,我们对子弹的处理经常性的是先把它实例化出来,然后我们再让他移动进行攻...

  • Unity对象池

  • unity对象池

    在网上看见了对象池的一些应用,一直很好奇,所以来研究一下 对象池主要的用途就是在那些需要重复被创建和销毁的物体上可...

  • Unity——对象池

    前言 实现对象池的步骤 代码 该脚本可以添加到创建的空物体身上,注意游戏场景中必须要有带有碰撞器的对象存在,不然,...

  • [Unity]对象池

    对象池的作用 避免一直重复的创建和销毁某个对象,增加消耗 理解 就是在开辟一个地方,去储存会大量实例化和销毁的对象...

  • Unity 对象池

    最近在学习 Unity 官方的 《Tower Defense Template》[https://unity3d....

  • Unity中的GC以及优化

    转载自# Unity优化之GC——合理优化Unity的GChttp://www.cnblogs.com/zblad...

  • Unity 类对象池资源池对象池

    类对象池 包含创建对象池,取对象池中的内容,回收。 对象管理类 因为使用加载AB包的时候可能会频繁创建类,但是ne...

网友评论

      本文标题:Unity优化之对象池

      本文链接:https://www.haomeiwen.com/subject/qepomftx.html