Unity-对象池

1.什么是对象池

学习框架的时候发现了很多地方都用了对象池,又看到了几种对象池,虽然有些地方不一样,但是大致思想是一样的,就是将对象保存到List链表中。当用到对象的时去链表内获取,如果链表内不存在或者存在的对象正在使用的话就需要创建一个对象并添加到链表内,当不使用此对象时需要关闭对象状态。这种方式应该只有Unity中GameObject的显示隐藏的感觉。

2.对象池的使用

知道了对象池,什么时候使用呢,个人觉得是一个场景中如果多次创建同一个对象时就可以使用了。为什么是一个场景,就是当我跳转场景后再次返回此场景的时候调用从对象池内获取对象就报空了。因为Unity的原因,跳转场景时会将物体销毁,咱们要是再接着调用此对象就报错了。

3.代码来了

3.1 结合ScriptableObject使用

1.对象池,功能获取一个资源从对象池内。

public class GameObjectPool
{   
    //对象池的名称 很有用的东西
    [SerializeField]
    public string name;
    //对象池的预制物体
    [SerializeField]
    private GameObject prefab;
    //当前对象池的最大个数
    private int maxAmout
    [SerializeField];

    [NonSerialized]
    private List<GameObject> goList=new List<GameObject>();

    ///<summary>
    ///表示从资源池中获取一个实例
    ///</summary>
    public GameObject GetIns()
    {
        foreache(GameObject go in goList)
        {
            if(!go.activeInHierarchy)
            {
                go.SetActive(true);
                return go;
            }           
        }

        if(goList.Count>=maxAmount)
        {
            Destroy(goList[0]);
            goList.RemoveAt(0);
        }

        GameObject temp = Instantiate(prefab) as GameObject;
        goList.Add(temp);
        return temp;
    }   
}

2.对象池列表,继承ScriptableObject对象

public class GameObjectPoolList:ScriptableObject
{
    //继承自ScriptableObject 表示把GameObjectPoolList变成自定义资源配置的文件
    public List<GameObjectPool> poolList;
}

3.生成.asset资产文件,赋值拖拽对象。

public class PoolManagerEditor : EditorWindown
{
    [MenuItem("Manager/CreateGameObjectPoolList")]
    static void CreateCreateGameObjectPoolList()
    {
        GameObjectPoolList poolList=ScriptableObject.CreateInstance<GameObjectPoolList>();
        AssetDatabase.CreateAsset(poolList,"Assets/Resources/gameobjectpool.asset");
        Assetdatabase.SaveAssets();
    }
}

这里写图片描述

这里写图片描述

4.如果一个场景中需要创建很多个不同种类的对象怎么办呢?创建一个PoolManager管理器

public class PoolManager
{
    //字典存储对象池的 key值为对象池名称,value值为对象池
    public Dictionary<string,GameObjectPool> poolDict;

    private PoolManager()
    {
        GaemObjectPoolList poolList=Resources.Load<GaemObjectPoolList>(gameobjectpool);

        poolDict= new Dictionary<string,GameObjectPool>();

        foreache(GameObjectPool pool in poolList.poolList)
        {
            poolDict.Add(pool.name,pool);
        }
    }

    public GameObject GetInst(string poolName)
    {
        GameObjectPool pool;

        if(poolDict.TryGetValue(poolName,out pool))
        {
            return pool.GetInst();
        }
        return null;        
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值