惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
博客园_首页
WordPress大学
WordPress大学
罗磊的独立博客
小众软件
小众软件
Last Week in AI
Last Week in AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
爱范儿
爱范儿
The Cloudflare Blog
GbyAI
GbyAI
C
Check Point Blog
腾讯CDC
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
博客园 - 聂微东
IT之家
IT之家
雷峰网
雷峰网
H
Help Net Security
博客园 - 叶小钗
美团技术团队
D
DataBreaches.Net

博客园 - 毛尹航

GAMES202课程资源 游戏设计制作配置表原则 Unity中文字和图片混合 UI仔需要了解的坑 遇到大段ifelse不要慌,先分层让条件正交 NGUI文字破碎 一个可以用的Lua的Class函数 写一个可以用的Lua打印Table的函数 关于C#的接口的碎碎念 C#中接口是值类型还是引用类型? Unity3d笔试题大全 FPSCalc——简单FPS观测类 MonoSingleton——Unity中的单例模式 用非递归、不用栈的方法,实现原位(in-place)的快速排序 一道有序洗牌的笔试题,阿里\UC等都用过 - 毛尹航 - 博客园 MFC中显示图像的放大、缩小、移动功能 MFC中设置对话框/窗体大小固定 MFC【5】MFC集合类 MFC【6】文件I/O和串行化
GameObjectPool——Unity中的对象池
毛尹航 · 2016-10-02 · via 博客园 - 毛尹航

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

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