浙江省建设厅网站地址网页游戏排行榜 2020

news/2025/9/24 9:26:21/文章来源:
浙江省建设厅网站地址,网页游戏排行榜 2020,计算机培训班有哪些,干洗店投资多少钱可以营业了文章目录 前言不使用对象池使用官方内置对象池应用 自制对象池总结源码参考完结 前言 对象池#xff08;Object Pool#xff09;是一种软件设计模式#xff0c;用于管理和重用已创建的对象。在对象池中#xff0c;一组预先创建的对象被维护在一个池中#xff0c;并在需要时… 文章目录 前言不使用对象池使用官方内置对象池应用 自制对象池总结源码参考完结 前言 对象池Object Pool是一种软件设计模式用于管理和重用已创建的对象。在对象池中一组预先创建的对象被维护在一个池中并在需要时使用和回收。对象池的作用是提供一种高效地创建和销毁对象的方式以减少系统开销和提高性能。 发明对象池的人绝对是个天才游戏中我们常常会遇到频繁创建和销毁大量相同对象的场景例如敌人子弹 如果我们不做任何处理只是单纯的创建和销毁可能会导致内存泄露性能下降和卡顿等问题 Instantiate(gameobject)Destroy(gameobject)对象池的出现减少了频繁创建和销毁对象带来的成本实现对象的循环和复用 在对象池设计理念中我们不再单纯的创建和销毁创建对象时我们会将对象存入对象池中需要使用对象时我们从池子中获取对象当不需要对象时我们再将对象存入对象池中以实现对象的循环复用减少频繁创建销毁象带来的成本 幸运的是从2021年3月版本后unity官方为我门内置了对象池接下来的教程我将以一个简单的例子带大家熟悉了解使用官方的对象池 不使用对象池 制作一个金币预制体挂载刚体、碰撞和Coin脚本 新增一个空对象用于生成金币挂载CoinPool脚本 Coin脚本代码金币接触地面销毁 private void OnCollisionEnter2D(Collision2D collision) // 碰撞检测 {Debug.Log(collision.gameObject.layer);if (collision.gameObject.layer LayerMask.NameToLayer(Ground)){//销毁Destroy(gameObject);} }CoinPool脚本代码 public GameObject coin; //金币预制体 public float time; //金币生成间隔时间 void Start() {StartCoroutine(go()); }IEnumerator go() {while (true){//协程每time秒执行一次CreateCoin();yield return new WaitForSeconds(time);} }//生成金币 private void CreateCoin() {GameObject gb Instantiate(coin, transform);//在当前对象处生成一个金币gb.transform.position new Vector3(Random.Range(-80f, -67f), Random.Range(3f, 9f));//随机生成位置 }效果可以看到我们只是单纯的创建和销毁金币 使用官方内置对象池 一、命名空间 using UnityEngine.Pool;二、构造方法 public ObjectPool(FuncT createFunc, ActionT actionOnGet null, ActionT actionOnRelease null, ActionT actionOnDestroy null, bool collectionCheck true, int defaultCapacity 10, int maxSize 10000 );参数列表解释 每个参数等号右边代表默认值即第一个参数为必填项。 1.Func createFunc 需填入一个带T类型返回值的方法即自定义新建对象时的操作2.Action actionOnGet, Action actionOnRelease, Action actionOnDestroy 分别为出池、进池、销毁的响应事件。填入自定义方法名即可用于拓展相应操作比如在actionOnDestroy中通过Destroy()方法将因为池满而不能入池的对象直接删除3.bool collectionCheck 是否在进池前检查对象是否已经存在池中4.int defaultCapacity, int maxSize 初始容量最大容量三、属性 1.int CountAll 所有的对象数三个属性都为只读初始值为0经测试已知每调用一次createFunc委托该值就会12.int CountActive 被启用的对象数已知每调用一次Release()方法就会-1Get()方法13.int CountInactive 未被启用的对象数已知每调用一次Release()方法就会1Get()方法-1,最大值为池的最大容量四、常用方法 1.T Get() 出池返回一个池中对象。如果池为空则先调用createFunc再出池2.void Relese(T element) 进池将对象element加入池。如果池已达到最大容量则不入池并触发actionOnDestroy事件3.void Clear() 清空池应用 使用官方内置对象池修改前面的例子 Coin脚本 using UnityEngine; using UnityEngine.Pool; public class Coin : MonoBehaviour {public ObjectPoolGameObject pool;private void OnCollisionEnter2D(Collision2D collision) // 碰撞检测{Debug.Log(collision.gameObject.layer);if (collision.gameObject.layer LayerMask.NameToLayer(Ground)){//销毁// Destroy(gameObject);pool.Release(gameObject);}} }CoinPool脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Pool;public class CoinPool : MonoBehaviour {public GameObject coin; //金币预制体public float time; //金币生成间隔时间public ObjectPoolGameObject pool;public int poolMaxSize;//对象池最大容量void Start(){//是否在进池前检查对象是否已经存在池中,初始容量最大容量pool new ObjectPoolGameObject(createFunc, actionOnGet, actionOnRelease, actionOnDestroy, true, 10, poolMaxSize);StartCoroutine(go());}IEnumerator go(){while (true){//协程每time秒执行一次CreateCoin();Debug.Log(总对象数pool.CountAll);Debug.Log(启用的对象数pool.CountActive);Debug.Log(未启用的对象数pool.CountInactive);yield return new WaitForSeconds(time);}}//生成金币private void CreateCoin(){// GameObject gb Instantiate(coin, transform);//在当前对象处生成一个金币GameObject gb pool.Get();gb.transform.position new Vector3(Random.Range(-80f, -67f), Random.Range(3f, 9f));//随机生成位置}// 需填入一个带T类型返回值的方法即自定义新建对象时的操作public GameObject createFunc(){GameObject obj Instantiate(coin, transform);obj.GetComponentCoin().pool pool;//将pool和Coin的pool赋值为同一个return obj;}void actionOnGet(GameObject gameObject){gameObject.SetActive(true);//显示敌人Debug.Log(gameObject.name 出池);}void actionOnRelease(GameObject gameObject){gameObject.SetActive(false);//隐藏敌人Debug.Log(gameObject.name 进池);}void actionOnDestroy(GameObject gameObject){Debug.Log(池已满, gameObject.name 被销毁);Destroy(gameObject);} }效果可以看到我们不再是单纯的创建和销毁金币而是开启和关闭复用前面生成的金币 自制对象池 新增对象池脚本ObjectPool using System.Collections.Generic; using UnityEngine;public class ObjectPool {private static ObjectPool instance; // 单例模式// /**// * 我们希望不同的物体可以被分开存储在这种情况下使用字典是最合适的// * 所以声明一个字典objectPool作为对象池主体以字符串类型的物体的名字作为key// * 使用队列存储物体来作为value,这里使用队列只是因为入队和出队的操作较为方便,也可以换成其他集合方式// * 然后实例化这个字典以备后续使用// * /private Dictionarystring, QueueGameObject objectPool new Dictionarystring, QueueGameObject(); // 对象池字典private GameObject pool; // 为了不让窗口杂乱声明一个对象池父物体作为所有生成物体的父物体public static ObjectPool Instance // 单例模式{get{if (instance null){instance new ObjectPool();}return instance;}}public GameObject GetObject(GameObject prefab) // 从对象池中获取对象{GameObject _object;if (!objectPool.ContainsKey(prefab.name) || objectPool[prefab.name].Count 0) // 如果对象池中没有该对象则实例化一个新的对象{_object GameObject.Instantiate(prefab);PushObject(_object); // 将新的对象加入对象池if (pool null)pool new GameObject(ObjectPool); // 如果对象池父物体不存在则创建一个新的对象池父物体GameObject childPool GameObject.Find(prefab.name Pool); // 查找该对象的子对象池if (!childPool){childPool new GameObject(prefab.name Pool); // 如果该对象的子对象池不存在则创建一个新的子对象池childPool.transform.SetParent(pool.transform); // 将该子对象池加入对象池父物体中}_object.transform.SetParent(childPool.transform); // 将新的对象加入该对象的子对象池中}_object objectPool[prefab.name].Dequeue(); // 从对象池中取出一个对象_object.SetActive(true); // 激活该对象return _object; // 返回该对象}public void PushObject(GameObject prefab) // 将对象加入对象池中{//获取对象的名称因为实例化的物体名都会加上(Clone)的后缀需要先去掉这个后缀才能使用名称查找string _name prefab.name.Replace((Clone), string.Empty);if (!objectPool.ContainsKey(_name))objectPool.Add(_name, new QueueGameObject()); // 如果对象池中没有该对象则创建一个新的对象池objectPool[_name].Enqueue(prefab); // 将对象加入对象池中prefab.SetActive(false); // 将对象禁用} }Coin脚本 using UnityEngine; using UnityEngine.Pool; public class Coin : MonoBehaviour {private void OnCollisionEnter2D(Collision2D collision) // 碰撞检测{// Debug.Log(collision.gameObject.layer);if (collision.gameObject.layer LayerMask.NameToLayer(Ground)){//销毁// Destroy(gameObject);// pool.Release(gameObject);ObjectPool.Instance.PushObject(gameObject);}} }CoinPool脚本 using System.Collections; using UnityEngine;public class CoinPool : MonoBehaviour {public GameObject coin; //金币预制体public float time; //金币生成间隔时间void Start(){StartCoroutine(go());}IEnumerator go(){while (true){//协程每time秒执行一次CreateCoin();yield return new WaitForSeconds(time);}}//生成金币private void CreateCoin(){// GameObject gb Instantiate(coin, transform);//在当前对象处生成一个金币// GameObject gb pool.Get();GameObject gb ObjectPool.Instance.GetObject(coin);gb.transform.position new Vector3(Random.Range(-80f, -67f), Random.Range(3f, 9f));//随机生成位置} }效果 总结 Unity官方内置对象池和自己写对象池都有各自的优缺点具体取决于你的需求和项目的规模。 如果你的游戏或应用程序很简单并且对象池的需求较小那么使用Unity官方内置的对象池是一个方便和快速的选择。Unity的对象池方法已经经过优化并且与引擎的其他功能集成得很好使用起来也非常简单。你可以直接使用ObjectPool类来创建和管理对象池而无需自己编写额外的代码。 然而当你的游戏或应用程序更复杂并且需要更高级的对象池功能时可能会需要自己编写对象池。自己编写对象池可以根据项目的具体需求进行定制化以满足特定的性能要求。你可以实现自己的池管理系统、缓存策略和对象回收机制以及其他高级功能如对象优先级、预加载等。 总的来说如果你的项目规模较小并且简单使用Unity官方内置对象池是一个方便的选择。如果你的项目更加复杂或有特定的需求编写自己的对象池可能更适合。最佳选择取决于你的项目需求、时间和资源限制以及你对对象池功能的具体要求。 如果是我的话我还是会选择自己写对象池脚本因为这样可以保证一定的可控性、复用性和可扩展性。 好多钱快去捡 源码 https://gitcode.net/unity1/objectpool 参考 【视频】https://www.bilibili.com/video/BV1Su411E7b2 完结 赠人玫瑰手有余香如果文章内容对你有所帮助请不要吝啬你的点赞评论和关注以便我第一时间收到反馈你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法也欢迎评论私信告诉我哦 好了我是向宇https://xiangyu.blog.csdn.net 一位在小公司默默奋斗的开发者出于兴趣爱好于是最近才开始自习unity。如果你遇到任何问题也欢迎你评论私信找我 虽然有些问题我可能也不一定会但是我会查阅各方资料争取给出最好的建议希望可以帮助更多想学编程的人共勉~

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

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

相关文章

怎样建设电影网站找人做一个小网站需要多少钱

当下,新媒体矩阵营销已成为众多企业的营销选择之一,各企业可以通过新媒体矩阵实现扩大品牌声量、维持用户关系、提高销售业绩等不同的目的。 而不同目的的矩阵,它的内容运营模式会稍有差别,评价体系也会大不相同。 企业在运营某类…

网站建设与实训怎么给网站引流

在大型语言模型(LLM)的世界中,有两个强大的框架用于部署和服务LLM:vLLM 和 Text Generation Interface (TGI)。这两个框架都有各自的优势,适用于不同的使用场景。在这篇博客中,我们将对这两个框架进行详细的…

连江网站建设c 语言网站建设

Zotero有着强大的文献管理功能,之前也对其进行过简要介绍(Zotero——一款文献管理工具),而安装一些必要的插件则可以使其如虎添翼,今天一起来探索一下一些实用的插件吧!(排名不分先后&#xff0…

怎样做访问外国网站才能不卡iis部署网站 错误400

一、axios Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 二、配置代理 1. 方法一 在…

按照DDD的方式写的一个.net有关Web项目框架

按照DDD的方式写的一个.net有关Web项目框架理想很丰满,现实往往很残酷。 一种按照ddd的方式,根据业务来把自己需要的模块一个一个写出来,再按照模块把需要的接口一个一个的写出来,堆砌一些中间件,以及解耦的comma…

css-图片文字对齐方式

<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">&…

基于Python+Vue开发的摄影网上预约管理系统源码+运行步骤

项目简介该项目是基于Python+Vue开发的摄影网上预约管理系统(前后端分离),影楼婚纱摄影,这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发…

【习题答案】《深入理解计算机系统(原书第三版)》

第一章 计算机系统漫游考察Amdahl 定律【练习题 1.1】 假设你是个卡车司机,要将土豆从爱达荷州的 Boise 运送到明尼苏达州的 Minneapolis, 全程 2500 公里。在限速范围内,你估计平均速度为 100 公里/小时,整个行程需…

企业网站推广方案网络营销作业seo技巧与技术

引言 一、性能怪兽-Nginx概念深入浅出 二、Nginx环境搭建 三、Nginx反向代理-负载均衡 四、Nginx动静分离 五、Nginx资源压缩 六、Nginx缓冲区 七、Nginx缓存机制 八、Nginx实现IP黑白名单 九、Nginx跨域配置 十、Nginx防盗链设计 十一、Nginx大文件传输配置 十二、Nginx配置SL…

建设网站公司价格怎么查找一个网站开发时间

在Linux上安装Oracle时&#xff0c;经常会报以下错误&#xff1a;无法使用命令 /usr/X11R6/bin/xdpyinfo 自动检查显示器颜色。请检查是否设置了DISPLA在Linux上安装Oracle时&#xff0c;经常会报以下错误&#xff1a;无法使用命令 /usr/X11R6/bin/xdpyinfo 自动检查显示器颜色…

用什么手机软件做网站成都创软科技的口碑

找问题找了一个多小时&#xff0c;不停调试&#xff0c;还修改文件路径&#xff0c;配置路径&#xff0c;开机关机&#xff0c;最后终于做出来了&#xff0c;得出来了一个结论 我绝对是天才 首先 看这个视频 k14 打包发布_哔哩哔哩_bilibili 不出意外&#xff0c;你绝对会在…

什么公司时候做网站佛山科技网站建设

飞书如何修改名称 点击编辑信息 在这里修改姓名就可以啦

google doc wordpressseo门户网站

来源&#xff5c;Sophia知乎&#xff0c;https://zhuanlan.zhihu.com/p/152362317本文仅用于学术分享&#xff0c;如有侵权&#xff0c;联系后台作删文处理编译&#xff1a;极市平台最近在做笔记查阅内容&#xff0c;觉得这个总结太美观了&#xff0c;真是棒&#xff01;吴恩达…

网站开发费用摊销时间互联网seo是什么

作者 | 小碗汤来源 | 我的小碗汤今天分享一个可以图形化搭建k8s集群的项目&#xff0c;不妨试一试~本项目是基于 Kubespray 提供图形化的 K8S 集群离线安装、维护工具。Kubespray&#xff1a;https://github.com/kubernetes-sigs/kubesprayKuboard-SprayKuboard-Spray 是一款可…

css-文字溢出省略号显示

<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">&…

天津网站制作专业深圳营销型网站制作

什么叫PC和手机端URL途径规范性在网址百度搜索引擎提升的全过程中&#xff0c;会牵涉到途径方位的难题。网址中的同一个网页页面只相匹配一个网站地址。一个规范化和简易的网站地址有利于检索和捕捉客户的记忆力&#xff0c;回绝好几条途径&#xff0c;偏向同一个网页页面&…

深入解析:mosquitto求医之路(3):Docker安装也不好使

深入解析:mosquitto求医之路(3):Docker安装也不好使pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

软件体系结构——负载均衡 - 指南

软件体系结构——负载均衡 - 指南2025-09-24 09:16 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impor…

css-定位让盒子居中显示

<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">&…