首页 > 其他分享 >13. 对象池

13. 对象池

时间:2024-03-04 14:56:51浏览次数:24  
标签:13 obj 对象 卡牌 SetActive public pool

创建对象池

我们后面会创建出很多的卡牌,如果每张卡牌都需要 Instantiate 和 Destroy 的话,就会非常消耗性能。因此我们使用对象池来管理这些对象,使它们的分配和开销减少

具体代码如下

using System.Diagnostics.Tracing;
using UnityEngine;
using UnityEngine.Pool;

public class PoolTool : MonoBehaviour
{
    public GameObject objPrefab;
    private ObjectPool<GameObject> pool;

    private void Start()
    {
        // 初始化对象池
        pool = new ObjectPool<GameObject>(
            createFunc: () => Instantiate(objPrefab, transform),
            actionOnGet: (obj) => obj.SetActive(true),
            actionOnRelease: (obj) => obj.SetActive(false),
            actionOnDestroy: (obj) => Destroy(obj),
            // 是否检查我们的对象
            collectionCheck: false,
            defaultCapacity: 10,
            maxSize: 20
        );

        PreFillPool(7);
    }

    private void PreFillPool(int count) 
    {
        var preFillArray = new GameObject[count];

        for (int i = 0; i < count; i++)
        {
            preFillArray[i] = pool.Get();
        }
        foreach (var item in preFillArray)
        {
            pool.Release(item);
        }
    }

    public GameObject GetObjectFromPool()
    {
        return pool.Get();
    }

    public void ReleaseObjectToPool(GameObject obj)
    {
        pool.Release(obj);
    }
}

在这段代码中,我们使用 new ObjectPool 新建了一个对象池。它创建新对象的时候使用Instantiate,从对象池获取对象的时候使用SetActive(true),将对象释放到对象池的时候使用SetActive(false),销毁对象使用Destroy。同时还指定,不检查对象,默认大小是10,最大大小是20

对象池一开始是不会分配对象的,所以我们需要在 Start 的时候先手动分配一些对象,并把它们返回到对象池中。这就是PreFillPool的实现方式

为了别人可以方便使用 PoolTool,所以我们需要开放两个接口GetObjectFromPoolReleaseObjectToPool,用于从对象池中获取对象,以及将对象返回到对象池中

卡牌管理器

对象池里面现在拥有的对象都是空白的对象,需要给它们进行赋值,这就是 CardManager 的工作了

CardManager 会从 Addressable 中读取所有卡牌类型,然后将它们保存到 cardDataList 中

请注意Addressables.LoadAssetsAsync<CardDataSO>("CardData", null),这句话的意思是读取 Addressable 中 key 为CardData的数据,因此我们需要将之前做的防御牌变成 Addressable

然后把它的标签改成CardData

运行检查结果

对象池成功分配了 7 张卡牌

卡牌管理器成功读到了 CardDataSO

项目相关代码

代码仓库:https://gitee.com/nbda1121440/DreamOfTheKingdom.git

标签:20240304_1428

标签:13,obj,对象,卡牌,SetActive,public,pool
From: https://www.cnblogs.com/hellozjf/p/18051780

相关文章

  • .NET Core AutoMapping 对象映射器转换
    先在NuGet程序包里下载这个文件然后新建一个类继承:ProfileusingAutoMapper;usingRBAC_Domain;usingRBAC_Domain.DTO;namespaceRBAC_Service.MyProFiles{///<summary>///转换对象映射器类///</summary>publicclassMappingProfile:Profile......
  • 【个人前端笔记】手写对象深拷贝
    一、对象深拷贝简单的方法:JSON序列化方法通过将对象转换成JSON格式并转换回对象,实现深拷贝leta1={a:"hello",b:"world",c:[1,2,3],d:{a:1,b:2}}leta2=JSON.parse(JSON.stringify(a1))console.log(a2);JSON序列化拷贝的缺点a.不支持......
  • python接口自动化系列(13):windows下allure报告展示
     本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/18033074实现目标上一步获取到测试报告的数据了,这里我们通过命令生成报告并在浏览器中查看报告。 allure-commandline在windows下安装、配置参考:https://www.cnblogs.com/uncleyong/p/16726826.html windows......
  • JAVA面向对象基础:入门,搞懂对象
     packagecom.itheima.duyixiang;importjava.util.ArrayList;importjava.util.List;publicclassTest{publicstaticvoidmain(String[]args){Students1=newStudent();s1.name="凯文";s1.yuwen=22;s1.shuxu......
  • CF1312C Adding Powers 题解
    题意:对于一个初始全\(0\)的序列,问是否能够进行若干次操作(第\(i\)次操作为对序列中任意一个元素增加\(k^i\)),使得此序列变为目标数组\(a\)。首先,我们令需要进行操作的序列为\(b\)。我们知道,如果能通过若干次操作将\(b\)变为\(a\),则有以下三种情形:\(a\)中的元素全......
  • P8598 [蓝桥杯 2013 省 AB] 错误票据 题解
    思路考虑将\(id\)从小到大排序,然后从\(2\)下标开始扫描一遍\(id\)数组,若当前的\(id_i-id_{i-1}>1\),则说明当前\(id\)存在断号,输出\(id_i-1\);若当前的\(id_i=id_{i-1}\),则说明当前\(id\)存在重号,输出\(id_i\)。注意断号与重号需要分开计算。#include<b......
  • PDF标准详解(二)——PDF 对象
    上一篇文章我们介绍了一个PDF文档应该包含的最基本的结构,并且手写了一个最简单的“HelloWorld”的PDF文档。后面我们介绍新的PDF标准给出示例时将以这个文档为基础,而不再给出完整的文档示例,小伙伴想自己测试可以根据上一节的文档来进行配置。对象上一节我们看到一个个奇奇怪......
  • day52 动态规划part9 代码随想录算法训练营 213. 打家劫舍 II
    题目:213.打家劫舍II我的感悟:看了题解不难,就是环这个思路转化很重要!理解难点:环的转化为,首,尾。代码上面可以省略长度为2的校验听课笔记:分3中情况:不考虑首尾|考虑首|考虑尾而情况2和情况3包含了情况1我的代码:classSolution:defrob(self,nums:List[i......
  • remote: Support for password authentication was removed on August 13, 2021.
    今天在pushcode的时候发现报了如下的错误remote:SupportforpasswordauthenticationwasremovedonAugust13,2021. 根据提示发现需要updategithub的token, https://github.com/settings/tokens  改好生成对应的token,记得保存好 gitpushhttps://<your_tok......
  • 【PG】查询 正在vacuum对象的(持续)时间
    --https://dataegret.com/2017/10/deep-dive-into-postgres-stats-pg_stat_progress_vacuum/SELECTp.pid,now()-a.xact_startASduration,coalesce(wait_event_type||'.'||wait_event,'f')ASwaiting,CASEWHENa.query~*'^autovacuum......