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

【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自带对象池

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Zabbix 部署----安装 Zabbix(监控服务器)
  • 分布式事务seata
  • Flutter 安装,配置,运行第一个app 1
  • C++对C的扩充
  • 【Qt】Qml界面中嵌入C++ Widget窗口
  • 【HarmonyOS NEXT】DevEco快速实现真机截屏,并保存到电脑
  • SMS over IP原理
  • Java设计原则
  • Mybatis 和 数据库连接
  • Java中的异步编程模式:CompletableFuture与Reactive Programming的实战
  • TIOBE 编程指数 9 月排行榜公布 VB.Net第七
  • 【深度学习】(3)--损失函数
  • Numpy
  • Java后端性能监控:使用JMX与Java Mission Control的深入解析
  • ppt一键生成免费版软件有哪些?如何高效生成论文答辩?
  • 分享一款快速APP功能测试工具
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [译] 怎样写一个基础的编译器
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 230. Kth Smallest Element in a BST
  • CentOS从零开始部署Nodejs项目
  • Electron入门介绍
  • emacs初体验
  • HTTP中GET与POST的区别 99%的错误认识
  • javascript 哈希表
  • Java基本数据类型之Number
  • leetcode98. Validate Binary Search Tree
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • React中的“虫洞”——Context
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • TypeScript实现数据结构(一)栈,队列,链表
  • 闭包,sync使用细节
  • 给初学者:JavaScript 中数组操作注意点
  • 今年的LC3大会没了?
  • 跨域
  • 前端自动化解决方案
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 一个项目push到多个远程Git仓库
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ‌JavaScript 数据类型转换
  • # Apache SeaTunnel 究竟是什么?
  • #13 yum、编译安装与sed命令的使用
  • #include<初见C语言之指针(5)>
  • #Spring-boot高级
  • #传输# #传输数据判断#
  • (12)目标检测_SSD基于pytorch搭建代码
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (转)使用VMware vSphere标准交换机设置网络连接
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .gitattributes 文件
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)