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

news2024/9/23 4:45:31

唐老师关于对物体分类的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;
 }

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()
        { 
    
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2156557.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pybullet 安装过程

Pybullet 安装过程&#xff08;windows&#xff09; 1. 安装C编译工具2. 安装Pybullet 1. 安装C编译工具 pybullet 需要C编译套件&#xff0c;直接装之前检查下&#xff0c;要不会报缺少某版本MVSC的error&#xff0c;最好的方式是直接下载visual studio&#xff0c;直接按默认…

多无人机通信(多机通信)+配置ssh服务

目录 多机通信 设备 主从机通信设置 配置从机 配置主机 测试 正式启用 MAVROS通信 多机通信 多机通信是实现机器人编队的基础&#xff0c;通过网络搭建通信链路。我们这里用中心节点网络通信&#xff0c;所有数据需有经过中心节点&#xff0c;所以&#xff0c;中心节点…

【有啥问啥】探索累计推理(Cumulative Reasoning, CR)——大型语言模型中的复杂推理新框架

探索累计推理&#xff08;Cumulative Reasoning, CR&#xff09;——大型语言模型中的复杂推理新框架 引言 随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在自然语言处理上的表现令人瞩目。然而&#xff0c;LLMs在…

实现人体模型可点击

简化需求&#xff1a;实现项目内嵌人体模型&#xff0c;实现点击不同部位弹出部位名称 一&#xff1a;优先3d&#xff0c; 方案&#xff1a;基于three.js&#xff0c;.gltf格式模型&#xff0c;vue3 缺点&#xff1a;合适且免费的3d模型找不到&#xff0c;因为项目对部位有要…

深度学习——D2(数据操作)

N维数组 创建数组 访问元素 一列: [ : , 1 ] 反向累积、正向累积&#xff08;自动求导&#xff09; 梯度 梯度&#xff08;Gradient&#xff09;是微积分中的一个重要概念&#xff0c;主要用于描述一个函数在某个区域内的变化情况。以下是对梯度的详细解释&#xff1a; 一…

树莓派pico上手

0 介绍 不同于作为单板计算机的树莓派5&#xff0c;树莓派 pico 是一款低成本、高性能的微控制器板&#xff0c;具有灵活的数字接口。主要功能包括&#xff1a; 英国树莓派公司设计的 RP2040 微控制器芯片双核 Arm Cortex M0 处理器&#xff0c;弹性的时钟频率高达 133 MHz26…

Qt笔记(十七)cmake编译Qt项目

Qt笔记&#xff08;十七&#xff09;cmake编译Qt项目 1. 文件内容与文件结构1.1.文件目录1.2. CMakeLists.txt内容1.3. main.cpp文件1.4. mouseevent.h1.5. mouseevent.cpp1.6. 生成Visual Studio项目后编译报错1.7. 界面显示中文乱码问题 1. 文件内容与文件结构 1.1.文件目录…

神奇的可变模板参数的应用(C++标准库双向链表 list 中的emplace函数实现)

我们先来看一个可以构造任意对象的函数&#xff1a; /// <summary> /// 可以构造任意对象的函数 /// </summary> /// <typeparam name"MyClass">要转换对象的类型</typeparam> /// <typeparam name"...MyClassConstructorParameterT…

传输层 II(TCP协议——协议的特点、报文段、连接管理)【★★★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、TCP 协议的特点 TCP 是在不可靠的 IP 层之上实现的可靠的数据传输协议&#xff0c;它主要解决传输的可靠、有序、无丢失和不重复问题。TCP 是 TCP/IP 体系中非…

使用Stream实现事件流

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了Flutter中的异步操作&#xff0c;本章回中将介绍Flutter中的事件流.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在上一章回中介绍了异步操作相关的内容&#xff0c;本章回中将介绍如何把…

施耐德EcoStruxure Machine SCADA Expert(EMSE)与SQL数据库连接(十五)

我习惯使用SQL Server 数据库与EMSE进行连接。 用的是sql 2017 关于数据库软件的安装教程 网上一大把。 1.新建数据库 打开数据库管理工具&#xff0c;新建数据库 2.新建表单 &#xff08;ps:这里先做一个小测试-----目的是验证与EMSE软件的链接是否顺畅。) 添加两个元素进去…

图神经网络的新篇章:通用、强大、可扩展的图变换器

人工智能咨询培训老师叶梓 转载标明出处 图变换器&#xff08;Graph Transformers, GTs&#xff09;因其在处理节点间全局依赖关系方面的能力而受到广泛关注。然而&#xff0c;现有的GTs模型在处理大规模图时面临着计算复杂度高、泛化能力有限等问题。为了解决这些问题&#x…

对比评测5款实用在线翻译工具,包括有道在线翻译

大家好&#xff0c;今天咱们来聊聊在线翻译工具。在这个信息爆炸的时代&#xff0c;语言不再是沟通的障碍&#xff0c;多亏了这些强大的翻译神器。今天&#xff0c;我将带大家比较五款热门的在线翻译工具&#xff0c;究竟谁更胜一筹呢&#xff1f;让我们一探究竟&#xff01; …

用友U8CRM relobjreportlist.php SQL注入漏洞复现

0x01 漏洞描述&#xff1a; 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件&#xff0c;旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 用友 U8 CRM客户关系管理系统relobjreportlist.php 文件存在SQL注入漏洞&#xff0c;未经身份验证的攻击者通过…

Linux 一些快捷键使用操作技巧

ctrl c : 强制停止 如图仅输入tail命令时程序会卡住&#xff0c;这时就需要强制停止 ctrl d : 退出或者登出 history : 查看历史输入命令 &#xff01;命令 &#xff1a;自动执行上一次匹配前缀的命令 &#xff08;注意不要用这个命令执行太过久远的&#xff0c;容易执行错误…

字节数据转16进制对应十进制数

在数据处理中经常面临字节数据需要转换成不同位宽的十进制数据&#xff0c;尤其是在嵌入式处理中该现象特别常见&#xff0c;这里以转换为16位位宽的十进制为例&#xff0c;采用python校本进行数据转换&#xff0c;具体数据如下&#xff1a; 要将上面数据转换为双字节十进制数…

英语六级-学习

01 英语分值比例 02听力学习 听力练习&#xff0c;基础好选择标准VOA和BBC。基础差选择VOA慢速。 听力内容包括不受政治争议的内容&#xff0c;社会生活类(奇闻趣事、日常生活)、经济类(商务、职场相关)、环保类、互联网类---------根据各类主题快速找到录音材料中心点。 研…

文心一言 VS 讯飞星火 VS chatgpt (352)-- 算法导论24.1 3题

三、给定 G(V,E) 是一带权重且没有权重为负值的环路的有向图&#xff0c;对于所有结点 v∈V ,从源结点 s 到结点 v 之间的最短路径中&#xff0c;包含边的条数的最大值为 m 。&#xff08;这里&#xff0c;判断最短路径的根据是权重&#xff0c;不是边的条数。&#xff09;请对…

leetcode:最高乘法得分

用auto可以过 class Solution { public:long long maxScore(vector<int>& a, vector<int>& b) {int n b.size();vector<vector<long long>> memo(4,vector<long long>(b.size(), LLONG_MIN));auto dfs [&](auto&& dfs, i…

Java-Part 0

Advanced Java and Cutting-edge Applications Part 0: Course presentation Part 1 其实就是个括号匹配问题&#xff0c;Stack 经典问题&#xff0c;但是好久没用Java&#xff0c;有一点点生疏&#xff0c;感觉老师的版本要简洁的多 package tiei.ajp.test;import java.uti…