Unity对象池技术

在游戏中,常常需要对有些游戏对象进行反复的创建销毁,比如游戏中的子弹,敌人

反复的创建与销毁将浪费一定的系统资源

引入对象池技术,可以将暂时不需要用到游戏对象放在对象池(缓冲区),当需要使用到时再从对象池中提取

这里我简单学习了下关于对象池,现在分享出来,写下自己的对对象池的理解


using UnityEngine;
using System.Collections.Generic;

public class PoolManager : MonoBehaviour 
{
    /// <summary>
    ///当游戏中只有一个对象需要用到对象池
    /// </summary>
    public List<GameObject> singlePool;


    /// <summary>
    /// 当游戏中有多个游戏对象需要用到对象池
    /// </summary>
    public Dictionary<int, List<GameObject>> mostPool;

    /// <summary>
    /// 单例模式
    /// </summary>
    public static PoolManager manager;

    public static PoolManager GetInstance()
    {
        if (manager != null)
        {
            manager = new PoolManager();
        }

        return manager;
    }

    /// <summary>
    /// 从对象池中创建单个游戏对象
    /// </summary>
    public GameObject CreateSingleGameobject(GameObject obj,Vector3 position,Quaternion rotation)
    {
        if(singlePool.Count>0)
        {
            GameObject m_obj=singlePool[0];
            singlePool.Remove(m_obj);

            m_obj.SetActive(true);

            m_obj.transform.position = position;
            m_obj.transform.rotation = rotation;

            return m_obj;
        }

        return GameObject.Instantiate(obj, position, rotation) as GameObject;
    }


    /// <summary>
    /// 将游戏对象取消激活,隐藏起来
    /// 并将其添加到对象池中,为了减少资源的浪费,不需要进行销毁
    /// </summary>
    /// <param name="obj"></param>
    public void HideSingleGameobject(GameObject obj)
    {
        //使其处于未机会隐藏状态
        obj.SetActive(false);

        //将其添加到对象池中
        singlePool.Add(obj);
    }


    /// <summary>
    /// 当游戏中有多个游戏对象需要在对象池中创建时
    /// </summary>
    /// <param name="obj">需要激活的游戏对象</param>
    /// <param name="position"></param>
    /// <param name="rotation"></param>
    /// <returns></returns>
    public GameObject CreateMostGameobject(GameObject obj,Vector3 position,Quaternion rotation)
    {
        int objID = obj.GetInstanceID();
        if (mostPool.ContainsKey(objID))
        {
            if (mostPool[objID].Count > 0)
            {
                GameObject m_obj = mostPool[objID][0];
                mostPool[objID].Remove(m_obj);

                m_obj.SetActive(true);

                m_obj.transform.position = position;
                m_obj.transform.rotation = rotation;

                return m_obj;
            }
        }  

        //如果对象池中没有该游戏对象,实例化一个游戏对象
        GameObject n_obj = GameObject.Instantiate(obj, position, rotation) as GameObject;

        return n_obj;
    }


    public void HideMostGameobject(GameObject obj)
    {
        int key = obj.GetInstanceID();
        if (!mostPool.ContainsKey(key))
        {
            mostPool.Add(key, new List<GameObject>());
        }

        mostPool[key].Add(obj);

        obj.SetActive(false);
    }
}

简单的一个Demo!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值