Unity Game FrameWork—模块使用—对象池使用

news2025/1/13 9:34:45

使用对象池,需继承ObjectBase。首先创建一个OPGame的类,继承于ObjectBase,我们暂且把它叫做OP对象,如下图
[图片]

OP对象有两个地方可以存储成员对象或变量,一个是在OP对象内部如模型ID:m_ModelID。另一个则是对象池基类ObjectBase里的m_Target可以存储任何数据类型,需要装箱和拆箱。在创建OP对象时,我们传入自定义的类型ModelInfor,并在基类初始化时作为参数传入。

API调用

创建OP对象池:
m_OPPool = GameEntry.ObjectPool.CreateSingleSpawnObjectPool(Utility.Text.Format(“OP Pool ({0})”, name), 20, 10, 0);
创建OP对象: 创建完成后处于使用中
ModelInfor ModelInfor = new ModelInfor(i);
OPGame OPGame = OPGame.Create(“模型” + CreateNums, CreateNums, ModelInfor);
m_OPPool.Register(OPGame, true);
获取OP对象: 从对象池中获取未使用的OP对象
OPGame OPGame = m_OPPool.Spawn(“模型” + 0);
回收OP对象: 将正在使用的对象释放,回收至对象池
m_OPPool.Unspawn(OPGame);
设置OP对象是否被加锁: 加锁后,不能从对象池中销毁
m_OPPool.SetLocked(OPGame, true);
设置OP对象优先级: 没啥卵用
m_OPPool.SetPriority(OPGame, 10);

完整代码

ProcedureObjectPool:启动流程,创建ObjectPlayer对象

using UnityEngine;
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;
namespace StarForce
{
    public class ProcedureObjectPool : ProcedureBase
    {
        public override bool UseNativeDialog
        {
            get
            {
                return true;
            }
        }

        public override void OnEnter(ProcedureOwner procedureOwner)
        {
            base.OnEnter(procedureOwner);
            GameObject TT = new GameObject("Player");
            TT.AddComponent<ObjectPlayer>();
        }
    }
}

OPGame :OP对象及所存储的数据类

using GameFramework;
using GameFramework.ObjectPool;
using UnityEngine;

public class OPGame : ObjectBase
{
    private int m_ModelID;

    public OPGame()
    {
    }

    public static OPGame Create(string name,int ID, ModelInfor Model)
    {
        OPGame InstanceOP = ReferencePool.Acquire<OPGame>();
        InstanceOP.Initialize(name, Model);
        InstanceOP.m_ModelID = ID;
        return InstanceOP;
    }

    public override void Clear()
    {
        base.Clear();
        m_ModelID = -1;
    }
    public override void Release(bool isShutdown)
    {
        
    }
}
public class ModelInfor
{
    private int ID;
    private Mesh Mesh;
    private Texture2D Texture2D;
    public ModelInfor(int ID)
    {
        this.ID = ID;
        Mesh = null;
        Texture2D = null;
    }
    public ModelInfor()
    {
        this.ID = -1;
        Mesh = null;
        Texture2D = null;
    }
    public Mesh GetMesh()
    {
        return Mesh;
    }
    public Texture2D GetTexture2D()
    {
        return Texture2D;
    }
    public int GetID()
    {
        return ID;
    }
}

ObjectPlayer :OP对象池调用实现

using GameFramework;
using GameFramework.ObjectPool;
using StarForce;
using System.Collections.Generic;
using UnityEngine;

public class ObjectPlayer : MonoBehaviour
{
    //创建对象名称编号
    int CreateNums = 0;
    private IObjectPool<OPGame> m_OPPool;
    List<OPGame> UsingOPGames;
    void Start()
    {
        m_OPPool = GameEntry.ObjectPool.CreateSingleSpawnObjectPool<OPGame>(Utility.Text.Format("OP Pool ({0})", name), 20, 10, 0);
        m_OPPool.AutoReleaseInterval = 5;
        UsingOPGames = new List<OPGame>();
    }
    [ContextMenu("CreateItem")]
    public void CreateItem()
    {
        for (int i = 0; i < 10; i++)
        {
            ModelInfor ModelInfor = new ModelInfor(i);
            OPGame OPGame = OPGame.Create("模型" + CreateNums, CreateNums, ModelInfor);
            //创建对象
            m_OPPool.Register(OPGame, true);
            UsingOPGames.Add(OPGame);
            if (CreateNums == 2)
            {
                CreateNums = 0;
            }
            else
            {
                CreateNums++;
            }
            if (i==0)
            {
                m_OPPool.SetLocked(OPGame, true);
                m_OPPool.SetPriority(OPGame, 10);
            }
            ModelInfor Model = (ModelInfor)OPGame.Target;
            Debug.LogError(Model.GetID());
        }
        
    }
    [ContextMenu("SpawnItem")]
    public void SpawnItem()
    {
        //获取对象
        OPGame OPGame = m_OPPool.Spawn("模型" + 0);
        UsingOPGames.Add(OPGame);
        Debug.LogError("获取的对象:"+OPGame.Name);
    }
    [ContextMenu("UnspawnItem")]
    public void UnspawnItem()
    {
        if (UsingOPGames.Count>3)
        {
            for (int i = 2; i >= 0; i--)
            {
                OPGame OPGame = UsingOPGames[i];
                //回收对象
                m_OPPool.Unspawn(OPGame);
                UsingOPGames.Remove(OPGame);
                Debug.LogError("释放的对象:" + OPGame.Name);
            }
        }
    }
}

实现效果

如图创建三个函数,CreateItem,SpawnItem,UnspawnItem
[图片]

函数调用入口如下,点击调用。调用顺序依次为CreateItem,UnspawnItem,SpawnItem
[图片]

CreateItem实现了创建10个对象,第一个对象加锁,优先级设置为10
[图片]

UnspawnItem实现了回收最先创建的三个对象
[图片]
SpawnItem实现了从对象池中获取名称为“模型0”的对象,InUse从false变为了true
[图片]
当我们不实现获取名称为“模型0”的操作时,过一会InUse状态为false的对象被对象池销毁了,而Locked设置为true的“模型0”则没有被销毁。
[图片]

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

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

相关文章

【LeetCode训练营02】两个非空链表相加 详解

目录 题目 解题思路的分享 解题源码的分享 题目 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以…

Executor框架简介

Executor系统中&#xff0c;将线程任务提交和任务执行进行了解耦的设计; 线程被一对一映射为服务所在操作系统线程&#xff0c;启动时会创建一个操作系统线程&#xff1b;当该线程终止时&#xff0c;这个操作系统线程也会被回收 Executor框架包含的核心接口和主要的实现类 具体…

Linux下安装Hive

文章目录 1. 确保linux环境下mysql已安装2. 上传安装包3. 解压安装包4. 修改目录名称5. 配置环境变量6. 解压日志jar包冲突7. 拷贝mysql驱动jar包8. 配置hive的参数文件9. 增加hadoop的配置参数10.在mysql中进行相关配置11. 初始化hive的元数据库 1. 确保linux环境下mysql已安装…

【Android】之【WebView】

一、简介 WebView是一种控件&#xff0c;它基于webkit引擎&#xff0c;因此具备渲染Web页面的功能。   基于Webview的混合开发&#xff0c;就是在 Android os(安卓)/I os(苹果)原生APP里&#xff0c;通过WebView控件嵌入Web页面。 你手机里有淘宝软件吧&#xff1f; 就是外…

uniapp开发微信小程序分包处理实录

uniapp开发微信小程序上传代码时可能会遇到项目过大问题&#xff0c;今天就结合自己的实际操作简单记录下如何处理项目代码超出限制问题。 常用的操作就是将项目中的图片访问由本地访问修改为网络访问&#xff0c;微信开发者工具上传代码时勾选相关的压缩文件选项等&am…

CV开启大模型时代!谷歌发布史上最大ViT:220亿参数,视觉感知力直逼人类

ViT模型何时才能破万亿&#xff1f; Transformer无疑是促进自然语言处理领域繁荣的最大功臣&#xff0c;也是GPT-4等大规模语言模型的基础架构。 不过相比语言模型动辄成千上万亿的参数量&#xff0c;计算机视觉领域吃到Transformer的红利就没那么多了&#xff0c;目前最大的…

《华为机试》——MP3光标位置 及 洗牌

本期&#xff0c;我给大家带来以下两个题目的讲解&#xff1a; 1、《华为机试》——MP3光标位置 &#xff08;中等&#xff09;2、 2017年校招真题——洗牌 &#xff08;简单&#xff09; 以上两个题的难度属于我也给大家标注出来了&#xff0c;接下来&#xff0c;我们一起去…

利用chatgpt处理Excel数据

一 前言 以前用chatgpt主要做问答&#xff0c;这次加入星球学习到了如何用chatgpt处理Excel&#xff0c;虽然现在处理起来还不是很方便&#xff0c;用熟悉了&#xff08;主要是熟悉提示词&#xff09;&#xff0c;处理起来会越来越快的。 二 准备工作 一个可用的chatgpt账号&…

针对jar和vue的一键自动化部署工具,界面友好操作简单

easy-jenkins是一款对vue和jar的部署工具&#xff0c;操作简单&#xff0c;实行一键部署&#xff0c;内部结构采用流水线形式架构&#xff0c;每次部署&#xff0c;时时提供部署过程&#xff0c;部署记录&#xff0c;界面友好简洁&#xff0c;使用方便&#xff0c;符合用户常规…

HTML学习(5)Canvas绘图

文章目录 HTML5 CanvasHTML5 内联SVG HTML5 Canvas 使用 Canvas 进行绘图工作&#xff0c;Canvas元素用于在网页上绘制图片。 创建一个Canvas的元素&#xff1a; <canvas id"myCanvas" width"200" height"100"></canvas>但是Canv…

设计模式 -- 装饰模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

操作系统原理 —— 什么是中断?(四)

我们先来看看早期的计算机的工作流程&#xff1a; 如上图&#xff0c;在早期的计算机假设有三个程序需要执行&#xff0c;执行顺序是&#xff1a;先执行程序1&#xff0c;等待程序1结束之后&#xff0c;再开始执行程序2&#xff0c;以此类推&#xff0c;所以它们是串行执行的…

使用ChatGPT编写Python接口的指南

使用ChatGPT编写Python接口的指南 ChatGPT是一种自然语言处理技术&#xff0c;可以用于各种文本生成任务。在本文中&#xff0c;我们将介绍如何使用Python编写ChatGPT的接口&#xff0c;并提供一些有用的技巧和示例代码。 步骤一&#xff1a;安装所需的库 在编写ChatGPT接口…

数据仓库的概念及与数据库等对比

1、什么是数据仓库&#xff1f; 数据仓库是信息&#xff08;对其进行分析可做出更明智的决策&#xff09;的中央存储库。通常&#xff0c;数据定期从事务系统、关系数据库和其他来源流入数据仓库。业务分析师、数据工程师、数据科学家和决策者通过商业智能 (BI) 工具、SQL 客户…

SOLIDWORKS机械设计如何控制尺寸?

机械设计过程中的尺寸把握&#xff0c;实际就是一个人的设计能力的体现&#xff0c;如果你不具备相应的设计能力&#xff0c;那所谓的尺寸把握是做不好的。所以今天在这里分享一套基本的设计流程和方法给大家&#xff0c;只有切实可行的方法才能打通你走向完善的专业技能之路。…

测试老鸟总结,性能测试如何做?常见异常有哪些?解决方法...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 常见的性能异常 …

1.Introduction: Hands-on Graph Neural Networks

PyG&#xff08;PyTorch Geometric&#xff09;是一个基于PyTorch的库&#xff0c;用于轻松编写和训练图形神经网络&#xff08;GNN&#xff09;&#xff0c;用于与结构化数据相关的广泛应用。博客好久没有更新了&#xff0c;恰逢1024创作纪念日&#xff0c;浅浅更新一下吧。 这…

logging模块

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 logging模块 日志级别修改logging模块默认行为logger对象 专栏&#xff1a;《python从入门到实战》 日…

MACH SYSTEMS网关:SAE J2716(SENT) 转 RS-232/CAN

双通道SAE J2716&#xff08;SENT&#xff09;至RS-232/CAN总线网关&#xff0c;具有两个双向SENT通道和RS-232&#xff08;SENT-RS232&#xff09;或CAN总线&#xff08;SENT-CAN&#xff09;接口。两种变体还提供两个模拟输出&#xff0c;可以直接将输入SENT数据转换为模拟电…

VMware SD-WAN 5.1 - 软件定义的 WAN

请访问原文链接&#xff1a;https://sysin.org/blog/vmware-sd-wan-5/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 产品概述 软件定义的 WAN (SD-WAN) SD-WAN 的功能特性 简化的 SD-WAN 了解软件定义的 WAN (SD-WAN) 的概…