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

Unity对象池的高级写法 (Plus优化版)

唐老师关于对物体分类的OOD的写法确实十分好,代码也耦合度也低,但是我有个简单的写法同样能实现一样的效果,所以我就充分发挥了一下主观能动性

相较于基本功能,这一版做出了如下改动

1.限制了对象池最大数量,多出来的要入池就会销毁掉

  // 最大容量private int maxCapacity = 100;

2.对生成出来的对象做出了二级分类更加清晰

 public void SetParent(string name, GameObject obj) {// 设置一级父对象if (poolObjF == null)poolObjF = new GameObject("一级分类");// 查找或创建二级父对象if (!poolObjS.ContainsKey(name)) {//创建临时物体当作二级分类空对象,之后添加到字典中GameObject tempObj = new GameObject("二级分类" + name);tempObj.transform.parent = poolObjF.transform;poolObjS[name] = tempObj;}obj.transform.parent = poolObjS[name].transform;}

98e18a00ff7a4b409b6f1ac7c7ecd596.gif

3.优化了清空池的方法

 public void ClearPool() {foreach (var item in pool) {foreach (var obj in item.Value) {GameObject.Destroy(obj);}}pool.Clear();poolObjF = null;poolObjS.Clear();}

4.添加了处理其他逻辑的函数,可以写一些重置AI状态的逻辑,会在拿出物体的时候调用

   /// <summary>/// 处理其他事情的逻辑可以写在这里面,比如重置怪物血量等/// </summary>public void OtherThing(){ }

 

5.切换场景不销毁池物品调用方法即可

    //public void DontDestoryPool(GameObject gameObject)//    {//   GameObject.DontDestroyOnLoad(gameObject);//}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MyPool : SingleBase<MyPool> {// 一级父对象private GameObject poolObjF;// 二级父对象字典private Dictionary<string, GameObject> poolObjS = new Dictionary<string, GameObject>();// 抽屉字典 string => 物品名字,List => 具体物品public Dictionary<string, List<GameObject>> pool = new Dictionary<string, List<GameObject>>();// 最大容量private int maxCapacity = 100;/// <summary>/// 得到对象池中的物品/// </summary>/// <param name="path">预制体路径</param>/// <returns></returns>public GameObject GetObj(string path) {GameObject obj = null;// 如果有该物体,从抽屉中取出,如果没有则创建一个if (pool.ContainsKey(path) && pool[path].Count > 0) {obj = pool[path][0];pool[path].RemoveAt(0);}else {obj = GameObject.Instantiate(Resources.Load<GameObject>(path));obj.name = path;}obj.SetActive(true);//OtherThing();return obj;}/// <summary>/// 向对象池放回物品/// </summary>/// <param name="name">要放回的抽屉名</param>/// <param name="obj">要放回的物品对象</param>public void PutBackObj(string name, GameObject obj) {SetParent(name, obj);obj.SetActive(false);// 如果有抽屉则放回去,没有则新建一个抽屉放进去,同时注意限制最大数量if (pool.ContainsKey(name)) {if (pool[name].Count < maxCapacity) {pool[name].Add(obj);}else {GameObject.Destroy(obj);}}else {pool.Add(name, new List<GameObject>() { obj });}}public void SetParent(string name, GameObject obj) {// 设置一级父对象if (poolObjF == null)poolObjF = new GameObject("一级分类");// 查找或创建二级父对象if (!poolObjS.ContainsKey(name)) {//创建临时物体当作二级分类空对象,之后添加到字典中GameObject tempObj = new GameObject("二级分类" + name);tempObj.transform.parent = poolObjF.transform;poolObjS[name] = tempObj;}obj.transform.parent = poolObjS[name].transform;}public void ClearPool() {foreach (var item in pool) {foreach (var obj in item.Value) {GameObject.Destroy(obj);}}pool.Clear();poolObjF = null;poolObjS.Clear();}/// <summary>/// 处理其他事情的逻辑可以写在这里面,比如重置怪物血量等/// </summary>public void OtherThing(){ }
}

 

 

相关文章:

Unity对象池的高级写法 (Plus优化版)

唐老师关于对物体分类的OOD的写法确实十分好&#xff0c;代码也耦合度也低&#xff0c;但是我有个简单的写法同样能实现一样的效果&#xff0c;所以我就充分发挥了一下主观能动性 相较于基本功能&#xff0c;这一版做出了如下改动 1.限制了对象池最大数量&#xff0c;多出来的…...

vue3<script setup>中computed

在 Vue 3 中&#xff0c;<script setup> 语法糖是 Composition API 的一种简化写法&#xff0c;它允许你更简洁地编写组件逻辑。在 <script setup> 中使用 computed 与在普通 <script> 标签中使用 Composition API 的方式类似&#xff0c;但通常我们会借助 i…...

【已解决】使用JAVA语言实现递归调用-本关任务:用循环和递归算法求 n(小于 10 的正整数) 的阶乘 n!。

本关任务&#xff1a;用循环和递归算法求 n&#xff08;小于 10 的正整数&#xff09; 的阶乘 n!。 测试说明 平台会对你编写的代码进行测试&#xff0c;比对你输出的数值与实际正确数值&#xff0c;只有所有数据全部计算正确才能通过测试&#xff1a; 测试输入&#xff1a;1…...

BiRefNet 教程:基于 PyTorch 实现的双向精细化网络

BiRefNet 教程&#xff1a;基于 PyTorch 实现的双向精细化网络 BiRefNet 是一个图像分割网络&#xff0c;专注于复杂任务如背景移除、掩码生成、伪装物体检测、显著性目标检测等。该模型结合了编码器、解码器、多尺度特征提取、以及梯度监督机制&#xff0c;能够有效处理不同类…...

Oracle 数据库安装和配置指南(新)

目录 1. 什么是Oracle数据库&#xff1f; 2. 安装前的准备工作 2.1 硬件要求 2.2 软件要求 2.3 下载Oracle安装包 3. Oracle数据库的安装步骤 3.1 Windows系统安装步骤 3.2 Linux系统安装步骤 4. 配置Oracle数据库 4.1 设置环境变量&#xff08;Linux&#xff09; 4.…...

JavaScript的注释与常见输出方式

注释 源码中注释是不被引擎所解释的&#xff0c;它的作用是对代码进行解释。Javascript 提供两种注释的写法:一种是单行注释&#xff0c;用//起头;另一种是多行注释&#xff0c;放在/*和*/之间。 单行注释&#xff1a; //这是单行注释 多行注释&#xff1a; /*这是 多行 注…...

深入探索Android开发之Java核心技术学习大全

Android作为全球最流行的移动操作系统之一&#xff0c;其开发技能的需求日益增长。本文将为您介绍一套专为Android开发者设计的Java核心技术学习资料&#xff0c;包括详细的学习大纲、PDF文档、源代码以及配套视频教程&#xff0c;帮助您从Java基础到高级特性&#xff0c;再到A…...

vue3 选择字体的颜色,使用vue3-colorpicker来选择颜色

1、有的时候我们会用到颜色的选择器&#xff0c;像element-plus提供了&#xff0c;但是ant-design-vue并没有&#xff1a; 这个暂时没有看到&#xff1a; 但是Ant Design 5的版本有&#xff0c;应该不是vue的。 2、使用第三方提供的vue3-colorpicker&#xff1a;storybook/cli…...

windows C++ 并行编程-使用消息块筛选器

本文档演示了如何使用筛选器函数&#xff0c;使异步消息块能够根据消息的有效负载接受或拒绝消息。 创建消息块对象(例如 concurrency::unbounded_buffer、concurrency::call 或 concurrency::transformer)时&#xff0c;可以提供筛选器函数&#xff0c;用于确定消息块是接受还…...

【mysql技术内幕】

MySQL之技术内幕 1.MVCC模式2. 实现mvcc模式的基础点3.MySQL锁的类型4. 说下MySQL的索引有哪些吧&#xff1f;5. 谈谈分库分表6. 分表后的id咋么保证唯一性呢&#xff1f;7. 分表后非sharding key的查询咋么处理的&#xff1f; 1.MVCC模式 MVCC, 是multi-version concurrency c…...

快递物流单号识别API接口DEMO下载

单号识别API为用户提供单号识别快递公司服务&#xff0c;依托于快递鸟大数据平台&#xff0c;用户提供快递单号&#xff0c;即可实时返回可能的一个或多个快递公司&#xff0c;存在多个快递公司结果的&#xff0c;大数据平台根据可能性、单号量&#xff0c;进行智能排序。 应用…...

Jetpack——Room

概述 Room是谷歌公司推出的数据库处理框架&#xff0c;该框架同样基于SQLite&#xff0c;但它通过注解技术极大简化了数据库操作&#xff0c;减少了原来相当一部分编码工作量。在使用Room之前&#xff0c;要先修改模块的build.gradle文件&#xff0c;往dependencies节点添加下…...

Dynamic Connected Networks for Chinese Spelling Check(ACL2021)

Dynamic Connected Networks for Chinese Spelling Check(ACL2021) 一&#xff0e;概述 文中认为基于bert的非自回归语言模型依赖于输出独立性假设。不适当的独立性假设阻碍了基于bert的模型学习目标token之间的依赖关系&#xff0c;从而导致了不连贯的问题。为些&#xff0c…...

前端vue-3种生命周期,只能在各自的领域使用

上面的表格可以简化为下面的两句话&#xff1a; setup是语法糖&#xff0c;下面的两个import导入是vue3和vue2的区别&#xff0c;现在的vue3直接导入&#xff0c;比之前vue2简单 还可以是导入两个生命周期函数...

el-upload如何自定展示上传的文件

Element UI 中&#xff0c;el-upload 组件支持通过插槽&#xff08;slot&#xff09;来自定义文件列表的展示方式。这通常是通过 file-list 插槽来实现的。下面是一个使用 el-upload 组件并通过 file-list 插槽来自定义文件列表展示的完整示例代码。 在这个示例中&#xff0c;…...

研1日记15

1. 文心一言生成&#xff1a; 在PyTorch中&#xff0c;nn.AdaptiveAvgPool1d(1)是一个一维自适应平均池化层。这个层的作用是将输入的特征图&#xff08;或称为张量&#xff09;在一维上进行自适应平均池化&#xff0c;使得输出特征图的大小在指定的维度上变为1。这意味着&…...

基于Nginx搭建点播直播服务器

实现直播和点播离不开服务器⽀持&#xff0c;可以使用开源的NGINX服务器搭建直播和点播服务。 当然&#xff0c;NGINX本身是不⽀持视频的&#xff0c;需要为NGINX增加相应的RTMP模块进行支持。 1、下载nginx和rtmp模块 # nginx wget ht tp://nginx.org/download/nginx-1.18.…...

QT LineEdit显示模式

QT LineEdit显示模式 QLineEdit 显示模式:   Normal 普通模式   NoEcho 不回写&#xff0c;即输入内容是有的&#xff0c;但是显示不出来,就是不在 QLineEdit 输入框中显示&#xff0c;但是触发例如 textChanged 信号会将所输入的文字写出来   Password 显示密码   Pa…...

IT技术在数字化转型中的关键作用

IT技术在数字化转型中的关键作用 在当今数字化浪潮中&#xff0c;IT技术无疑扮演着核心角色。无论是企业的数字化转型&#xff0c;还是政府公共服务的智能化提升&#xff0c;信息技术都在推动着整个社会向更高效、更智能的方向发展。本文将探讨IT技术在数字化转型中的关键作用…...

【C++指南】C++中nullptr的深入解析

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 目录 引言 一、nullptr的引入背景 二、nullptr的特点 1.类型安全 2.明确的空指针表示 3.函数重载支…...

颠覆式数据处理解决方案:CyberChef实现复杂数据转换的全流程优化

颠覆式数据处理解决方案&#xff1a;CyberChef实现复杂数据转换的全流程优化 【免费下载链接】CyberChef The Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysis 项目地址: https://gitcode.com/GitHub_Trending/cy/CyberChef …...

从防御者视角复盘:当你的Win11突然断网,如何快速排查是不是遭遇了ARP欺骗?

从防御者视角复盘&#xff1a;当你的Win11突然断网&#xff0c;如何快速排查是不是遭遇了ARP欺骗&#xff1f; 办公室里突然有人喊"网络断了"&#xff0c;你的Win11电脑明明显示Wi-Fi已连接&#xff0c;却打不开任何网页。这种情况可能不只是简单的路由器故障——ARP…...

从零部署RT-DETR:手把手教你训练自定义目标检测数据集

1. RT-DETR简介与环境配置 RT-DETR是百度推出的实时目标检测Transformer模型&#xff0c;相比传统CNN架构的YOLO系列&#xff0c;它在保持高精度的同时实现了更快的推理速度。我第一次接触这个模型时&#xff0c;就被它的"端到端检测"特性吸引了——不需要复杂的后处…...

汇川PLC与IS620N伺服驱动实战:手把手教你完成EtherCAT网络配置与电机命名

汇川PLC与IS620N伺服驱动深度配置指南&#xff1a;从EtherCAT组态到电机精准控制 在工业自动化领域&#xff0c;伺服系统的稳定性和响应速度直接决定了设备性能的上限。汇川AM600系列PLC搭配IS620N伺服驱动组成的EtherCAT网络&#xff0c;正成为越来越多自动化工程师的首选方案…...

GitHub界面中文化:如何让全球最大的代码托管平台说中文?

GitHub界面中文化&#xff1a;如何让全球最大的代码托管平台说中文&#xff1f; 【免费下载链接】github-chinese GitHub 汉化插件&#xff0c;GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 当我们…...

精准定位CPU核心稳定性:CoreCycler单核心测试全指南

精准定位CPU核心稳定性&#xff1a;CoreCycler单核心测试全指南 【免费下载链接】corecycler Script to test single core stability, e.g. for PBO & Curve Optimizer on AMD Ryzen or overclocking/undervolting on Intel processors 项目地址: https://gitcode.com/gh…...

百川2-13B-4bits开源大模型镜像免配置优势:内置check.sh脚本实现7维度健康检查

百川2-13B-4bits开源大模型镜像免配置优势&#xff1a;内置check.sh脚本实现7维度健康检查 1. 为什么说这个镜像"开箱即用"&#xff1f; 如果你之前部署过大语言模型&#xff0c;肯定经历过这些头疼事&#xff1a;环境配置报错、依赖包冲突、端口被占用、GPU显存不…...

YOLOv8与YOLOv11网络结构对比:从yolov8.yaml到yolo11.yaml的演进与优化

YOLOv8与YOLOv11网络结构深度对比&#xff1a;从架构设计到性能优化 在计算机视觉领域&#xff0c;目标检测技术一直是研究热点&#xff0c;而YOLO(You Only Look Once)系列作为其中的佼佼者&#xff0c;以其高效的实时检测能力广受关注。本文将深入剖析YOLOv8与YOLOv11的网络结…...

xgboost 训练一个 限制各个因素相关性的模型

XGB/LGB调参秘籍&#xff0c;解锁新高度&#xff01; 在机器学习特别是风控模型的应用中&#xff0c;XGBoost和LightGBM因其出色的性能而备受青睐。然而&#xff0c;要充分发挥这些模型的潜力&#xff0c;合理的参数调校至关重要。今天&#xff0c;我们就来深入探讨XGBoost/Lig…...

从草图到逼真人脸:Qwen-Image-Edit-F2P结合ControlNet的进阶玩法展示

从草图到逼真人脸&#xff1a;Qwen-Image-Edit-F2P结合ControlNet的进阶玩法展示 最近在玩AI图像生成的朋友&#xff0c;可能都遇到过这样的烦恼&#xff1a;想让AI画一张特定角度、特定表情的人脸&#xff0c;光靠文字描述&#xff0c;结果总是像开盲盒。你说“一个微笑的东方…...