Unity对象池实现

Unity对象池实现

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/**
 * 对象池
 */
public class ObjectPool
{
    //单例模式
    private static ObjectPool instance = null;
    private ObjectPool() { }
    public static ObjectPool Instance
    {
        get
        {
            if (instance == null){
                instance = new ObjectPool();
            }
            return instance;
        }
    }

    //数据部分
    Dictionary<string, List<GameObject>> pool = new Dictionary<string, List<GameObject>>();
    //API部分
    /// <summary>
    /// 往对象池中放入某一游戏物体
    /// </summary>
    /// <param name="obj">要放到对象池中对象</param>
    public void Put(GameObject obj)
    {
        //不是第一次的情况
        if (pool.ContainsKey(obj.name))
        {
            pool[obj.name].Add(obj);
        }else{
            //第一次存入该类游戏物体
            //声明一个新的列表装该类游戏物体
            List<GameObject> list = new List<GameObject>();
            //创建键名和键值的对应关系
            pool.Add(obj.name, list);
            //把游戏物体放到列表中
            list.Add(obj);
        }
        //将放入对象池的物体隐藏
        obj.SetActive(false);
    }

    /// <summary>
    /// 从对象池中获取某一名字的游戏物体
    /// </summary>
    /// <param name="key">要获取的游戏物体名</param>
    /// <returns></returns>
    public GameObject Get(string key)
    {
        //检测是否存在该名字的物体
        if (pool.ContainsKey(key))
        {
            //列表中是否还有剩余元素
            if (pool[key].Count <= 0) 
            {
                return null;
            }else {
                //拿到具体游戏物体并返回
                GameObject obj = pool[key][0];
                //将游戏物体从对象池中删除
                pool[key].Remove(obj);
                obj.SetActive(true);
                return obj;
            } 
        }else{
            return null;
        }
    }

    /// <summary>
    /// 清空对象池,在跳转场景时调用
    /// </summary>
    public void Clear()
    {
        //static修饰的对象在unity中跳转场景时不会被释放
        pool.Clear();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值