GameObjectPool——Unity中的对象池

Posted 观音孔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GameObjectPool——Unity中的对象池相关的知识,希望对你有一定的参考价值。

这里介绍一种对象池的写法。它的优点在于无论取出还是插入游戏物体都是常数量时间。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
//对象池
public class GameObjectPool : MonoSingleton<GameObjectPool>
{

    /// <summary>可能存放多个种类的对象,每个种类有多个对象 </summary>
    private Dictionary<string, LinkedList<GameObject>> Pool = new Dictionary<string, LinkedList<GameObject>>();
    private Dictionary<GameObject, LinkedListNode<GameObject>> ObjectDic = new Dictionary<GameObject, LinkedListNode<GameObject>>();
    /// <summary>增加物体进入池(按类别增加)</summary>
    public void Add(string key, GameObject go)
    {
        //1.如果key在容器中存在,则将go加入对应的列表
        //2.如果key在容器中不存在,是先创建一个列表,再加入
        if (!Pool.ContainsKey(key))
        {
            Pool.Add(key, new LinkedList<GameObject>());
        }
        LinkedListNode<GameObject> t = new LinkedListNode<GameObject>(go);
        Pool[key].AddLast(t);
        ObjectDic[go] = t;

    }

    /// <summary>销毁物体(将对象隐藏)</summary>
    public void MyDestory(string key, GameObject destoryGo)
    {
        //设置destoryGo隐藏
        ObjectDic[destoryGo].Value.SetActive(false);
        LinkedListNode<GameObject> temp = ObjectDic[destoryGo];
        Pool[key].Remove(temp);
        Pool[key].AddFirst(temp);
    }

    /// <summary>将对象归入池中<summary>
    public void MyDestory(string key, GameObject tempGo, float delay)
    {
        //开启一个协程
        StartCoroutine(DelayDestory(key, tempGo, delay));
    }

    /// <summary>延迟销毁</summary>
    private IEnumerator DelayDestory(string key, GameObject destoryGO, float delay)
    {
        //等待一个延迟的时间
        yield return new WaitForSeconds(delay);
        MyDestory(key, destoryGO);
    }


    /// <summary>创建一个游戏物体到场景 </summary>
    public GameObject CreateObject(string key, GameObject go, Vector3 position, Quaternion quaternion)
    {
        //先找是否有可用的,如果没有则创建,如果有找到后设置好位置,朝向再返回
        GameObject tempGo = Pool[key].First.Value;
        if (tempGo.activeSelf == false)
        {
            tempGo.transform.position = position;
            tempGo.transform.rotation = quaternion;
            tempGo.SetActive(true);
            Pool[key].RemoveFirst();
            Pool[key].AddLast(ObjectDic[tempGo]);
        }
        else
        {
            tempGo = GameObject.Instantiate(go, position, quaternion) as GameObject;
            Add(key, tempGo);
        }
        return tempGo;

    }

    /// <summary>清空某类游戏对象</summary>
    public void Clear(string key)
    {
        var t = Pool[key].First;
        while (t.Next!=null)
        {
            ObjectDic.Remove(t.Value);
        }
        Pool.Remove(key);

    }

    /// <summary>清空池中所有游戏对象</summary>
    public void ClearAll()
    {
        ObjectDic.Clear();
        Pool.Clear();
    }
}

  

  

以上是关于GameObjectPool——Unity中的对象池的主要内容,如果未能解决你的问题,请参考以下文章

Unity - 围绕 2D 中的点旋转对象

Unity中的游戏对象[]

如何在 Unity 中正确导入 fbx?

如何使游戏对象在旋转平面中围绕 Unity 中的另一个游戏对象旋转

Unity中的游戏对象(卡在屏幕边缘)

使用Unity中的Json将我的游戏对象保存在地图中[重复]