当前位置: 首页 > article >正文

【Unity】对象池 - 未更新完

自定义泛型对象池

文章目录

  • 自定义泛型对象池
    • 封装泛型类
    • 例子
  • 使用Unity自带对象池

封装泛型类

public abstract class MyPool<T> : MonoBehaviour where T :Component
{
    [SerializeField] protected T prefab; // 生成的预制体
    [SerializeField] protected int defaultNum; // 池子的大小
    protected Queue<T> pool = new Queue<T>(); // 队列存储池子

    protected bool IsPoolEmpty() => pool.Count == 0;
    protected bool IsPoolFull() => pool.Count > prefab;
	
	// 对象池四件套
    protected virtual T OnCreateItem() => Instantiate(prefab, transform);
    protected virtual void OnGetItem(T obj) => obj.gameObject.SetActive(true);
    protected virtual void OnReleaseItem(T obj) => obj.gameObject.SetActive(false);
    protected virtual void OnDestroy(T obj) => Destroy(obj.gameObject);
	
	// 用来获得对象后初始化一些信息
    protected abstract void InitializedObj(T obj); 
    protected T Get()
    {
        T obj;
        if (IsPoolEmpty()) obj = OnCreateItem();
        else
        {
            obj = pool.Dequeue();
            OnGetItem(obj);
        }

        InitializedObj(obj);
        return obj;
    }

    protected void Release(T obj)
    {
        if (IsPoolFull()) OnDestroy(obj);
        else
        {
            pool.Enqueue(obj);
            OnReleaseItem(obj);
        }
    }

}

例子

BoxPool:

public class BoxPool : MyPool<Box> 
{
    public float IntervalTime = 0.1f;
    void Start()
    {
        StartCoroutine(ContinueCreateBox());
    }
	
	// 不断生成对象
    private IEnumerator ContinueCreateBox()
    {
        while (true)
        {
            Box box = Get(); // 获得出来使用
            yield return new WaitForSeconds(IntervalTime);
        }
    }
	
	// 重写创建对象方法,添加委托
    protected override Box OnCreateItem()
    {
        Box box = base.OnCreateItem();
        box.SetBackDestroy(() => {
            Release(box);
        });
        return box;
    }
	
	// 完成抽象方法,初始化信息
    protected override void InitializedObj(Box obj)
    {
        obj.transform.position = transform.position + Random.insideUnitSphere * 2f; // 半径2内随机 
        obj.transform.rotation = Quaternion.identity;
        obj.GetComponent<Rigidbody>().velocity = Vector3.zero; // 重置刚体速度,否则会越掉越快
    }

}

Box:

public class Box : MonoBehaviour
{
    public UnityAction backDestroy;

    private float intervalTime = 1.5f;
    private float nowTime;

    private void Update() 
    {
        nowTime += Time.deltaTime;
        if (nowTime > intervalTime)
        {
            nowTime = 0;
            backDestroy?.Invoke();
        }
    }

    public void SetBackDestroy(UnityAction back)
    {
        backDestroy = back;
    }
}

不断生成Box

使用Unity自带对象池


http://www.kler.cn/a/313537.html

相关文章:

  • Toeplitz矩阵循环矩阵
  • RAFT: Recurrent All-Pairs Field Transforms for Optical Flow用于光流估计的循环全对场变换
  • 【Python TensorFlow】进阶指南(续篇一)
  • pgsql和mysql的自增主键差异
  • Golang常见编码
  • css:没错又是我
  • leetcode:2124. 检查是否所有 A 都在 B 之前(python3解法)
  • XXL-JOB 漏洞大全
  • 计算机毕业设计 美发管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 逻辑运算符
  • 第T10周:数据增强
  • 使用 Internet 共享 (ICS) 方式分配ip
  • 从虚拟机安装CentOS到自定义Dockerfile构建tomcat镜像
  • 【云安全】云服务安全攻防
  • 2024华为杯研赛C题原创python代码+结果表(1-2问)|全部可运行|精美可视化
  • openstack中的rabbitmq
  • 清理C盘缓存,电脑缓存清理怎么一键删除,操作简单的教程
  • E2VPT: An Effective and Efficient Approach for Visual Prompt Tuning
  • 系统架构设计师教程 第5章 5.1 软件工程 笔记
  • 面向过程和面向对象思想
  • Linux:开源世界的璀璨明珠
  • 深度学习-13-小语言模型之SmolLM的使用
  • 【Linux 从基础到进阶】OpenStack 私有云平台搭建
  • SpringBoot使用@Scheduled注解实现定时任务
  • MavenMyBatis
  • 0基础跟德姆(dom)一起学AI 数据处理和统计分析04-Panda入门