游戏中对象池的应用

在开发游戏,经常会需要创建一些对象,如果对象少还可以,如果创建的对象数量很多 ,那对于对于系统的开销就很大,如果这些对象对于游戏有持续性的作用也无可厚非,但是有一些,创建过后几秒,可能就没有任何意义,比如跑步游戏中吃的金币,射击游戏中发射的子弹。
正常我们会把这些物体销毁,或者隐藏,这就会导致占用了一部分不需要的系统开销或者导致大量非活跃的对像保存在游戏场景中。
为了解决这种大量创建重复且非持续性保持作用的对象对游戏中内存造成的损耗问题,我们就一使用对象池方式来解决。

***一:创建对象池
二:回收对象到对象池中
三:从对象池中获取对象***
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class objPool{
    private static objPool instanse;//单例
    public objPool _instance()
    {
        if (instanse==null)
        {
            instanse = new objPool();
        }
        return instanse;          
    } 
    private Dictionary<string, List<GameObject>> pool;//存储对象池的名字和对应的池子
    
    public void RecycleObj(GameObject obj) // 对象池的创建和回收
    {
        //判断是否有该对象的对象池
        if (pool.ContainsKey(obj.name))
        {
            //放置到该对象池
            pool[obj.name].Add(obj);
        }
        else
        {
            //创建该类型的池子,并将对象放入
            pool.Add(obj.name, new List<GameObject>() { obj });
        }
        //设置为非激活
        obj.SetActive(false);
    }
    public GameObject GetObj(string objName) // 从对象池中获取对象
    {
        GameObject result = null;
        //判断是否有该名字的对象池
        if (pool.ContainsKey(objName))
        {
            //判断该物体对象池里是否有对象
            if (pool[objName].Count > 0)
            {
                //获取结果
                result = pool[objName][0];
                //激活对象
                result.SetActive(true);
                //从池中移除该对象
                pool[objName].Remove(result);
                //返回结果
                return result;
            }
             Debug.LogError("请往该对象池先添加对象:"+objName);
               return null;
        }
        Debug.LogError("请先创建该物体对象池:"+objName);
        return null;
    }
}

这个写的比较简单,实际上企业运用的上复杂些,大概就是这么一个池的思想

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值