Unity SKFramework框架(五)、ObjectPool 对象池

举报
CoderZ1010 发表于 2022/09/25 05:31:23 2022/09/25
【摘要】 目录 简介 一、ObjectPool 1.分配对象 2.回收对象 3.缓存数量 4.释放对象池 二、MonoObjectPool 1.创建方法 2.分配对象 3.回收对象 4.缓存数量 5.释放对象池 简介        &nbs...

目录

简介

一、ObjectPool

1.分配对象

2.回收对象

3.缓存数量

4.释放对象池

二、MonoObjectPool

1.创建方法

2.分配对象

3.回收对象

4.缓存数量

5.释放对象池


简介

        框架中将对象池划分为两种,一种是通过new运算符创建对象的对象池,另一种是对象类继承自MonoBehaviour,需要自定义创建方法的对象池,我们将它们分别称为ObjectPool、MonoObjectPool。

        为需要实现对象池管理的对象类继承IPoolable接口,接口中包含bool类型字段IsRecycled,用于标记该对象是否已经回收,以及OnRecycled方法,用于实现对象的回收事件。

一、ObjectPool

以一个Person类为例,为其继承IPoolable接口,并实现接口中属性和方法:

public class Person : IPoolable
{
    public string Name { get; set; }
    public int Age { get; set; }
    public float Weight { get; set; }

    public bool IsRecycled { get; set; }
    public void OnRecycled()
    {
        Name = null;
        Age = 0;
        Weight = 0f;
    }
}

1.分配对象

public class Example : MonoBehaviour
{
    private void Start()
    {
        //分配对象
        Person person = ObjectPool.Allocate<Person>();
        person.Name = "CoderZ";
        person.Age = 28;
        person.Weight = 60f;
    }
}

2.回收对象

public class Example : MonoBehaviour
{
    private void Start()
    {
        //分配对象
        Person person = ObjectPool.Allocate<Person>();
        person.Name = "CoderZ";
        person.Age = 28;
        person.Weight = 60f;

        //回收对象
        ObjectPool.Recycle(person);
    }
}

3.缓存数量

        对象池中默认的最大缓存数量为9,可以通过如下方式修改该值,当我们修改该值时,系统会判断池中的数量是否已经大于目标值,如果大于则根据差值进行释放。

//设置对象池的最大缓存数量
ObjectPool.SetMaxCacheCount<Person>(100);

4.释放对象池

释放对象池不仅是释放池中的对象,对象池本身也会被释放。

//释放对象池
ObjectPool.Release<Person>();

二、MonoObjectPool

以一个Bullet子弹类为例,它挂载于子弹的Prefab预制体上

using UnityEngine;
using SK.Framework;

public class Bullet : MonoBehaviour, IPoolable
{
    public bool IsRecycled { get; set; }

    public void OnRecycled()
    {
        gameObject.SetActive(false);
        transform.localPosition = Vector3.zero;
        transform.localRotation = Quaternion.identity;
    }
}

1.创建方法

Mono类型的对象池,我们在使用之前首先需要自定义一个创建方法:

using UnityEngine;
using SK.Framework;

public class Example : MonoBehaviour
{
    //子弹预制体
    [SerializeField] private GameObject bulletPrefab;

    private void Start()
    {
        MonoObjectPool.CreateBy(() =>
        {
            var instance = Instantiate(bulletPrefab);
            instance.transform.SetParent(transform);
            instance.transform.localPosition = Vector3.zero;
            instance.transform.localRotation = Quaternion.identity;
            instance.SetActive(true);
            Bullet bullet = instance.GetComponent<Bullet>();
            return bullet;
        });
    }
}

2.分配对象

//分配对象
Bullet bullet = MonoObjectPool.Allocate<Bullet>();

3.回收对象

//分配对象
Bullet bullet = MonoObjectPool.Allocate<Bullet>();
//回收对象
MonoObjectPool.Recycle(bullet);

4.缓存数量

//设置对象池的最大缓存数量
MonoObjectPool.SetMaxCacheCount<Bullet>(99);

5.释放对象池

//释放对象池
MonoObjectPool.Release<Bullet>();

文章来源: coderz.blog.csdn.net,作者:CoderZ1010,版权归原作者所有,如需转载,请联系作者。

原文链接:coderz.blog.csdn.net/article/details/124770956

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。