博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity中的DestroyImmediate
阅读量:6688 次
发布时间:2019-06-25

本文共 1611 字,大约阅读时间需要 5 分钟。

 在写编辑器的过程中,想要动态销毁场景里面的游戏体时,被unity说不能用Destory,只能用DestoryImmediate,查看这个函数的api,该函数解释:

该函数只在写编辑器代码时使用,因为延时的销毁永远不会在编辑模式下调用。在游戏代码推荐使用代替。销毁总是延迟的(但在同一帧内执行),小心使用该函数,因为它能永久销毁资源。

看似没问题,直接使用了DestrotyImmediate

 

1 private void DeleteTrans() 2  3     { 4  5         foreach (Transform tran in transform) 6  7         { 8  9             if (tran.name == "bullet" || tran.name == "effect")10 11             {12 13                 DestroyImmediate(tran.gameObject);14 15             }16 17         }18 19     }

 

 

结果发现,不能删尽,再回头看DestoryImmediate的api解释,是不是DestoryImmediate也有延迟,或者说某种机制让他没有删尽。个人觉得,因为Transform是个迭代器类型,删除的过程中迭代器内容发生改变而不能删尽。尝试修正如下:

 

1 private void DeleteTrans() 2  3     { 4  5         List
trans = new List
(GetTransform
()); 6 7 8 9 foreach (Transform tran in trans)10 11 {12 13 if (tran.name == "bullet" || tran.name == "effect")14 15 {16 17 DestroyImmediate(tran.gameObject);18 19 }20 21 }22 23 }24 25 26 27 private IEnumerable
GetTransform
()28 29 {30 31 IEnumerator tor = gameObject.transform.GetEnumerator();32 33 34 35 while (tor.MoveNext())36 37 {38 39 object current = tor.Current;40 41 yield return (T)current;42 43 }44 45 }

 

可以看出解决方案是先获取出所有节点存放在链表中,然后循环删除,不知道 List<Transform> trans = new List<Transform>(GetTransform<Transform>());这句是不是就是等待找出所有节点。.net没有帧的概念,unity的yield是携程返回,每帧都再调用。希望有高人解释一下。

转载于:https://www.cnblogs.com/dahaiwuliang/p/3927196.html

你可能感兴趣的文章
利用WordPress REST API 开发微信小程序从入门到放弃
查看>>
如何在页面引用外部的html
查看>>
Appium-IOS 真机测试
查看>>
插件 - 收藏集 - 掘金
查看>>
(转)详解spl_autoload_register()函数
查看>>
js 综合
查看>>
react开发教程(三)组件的构建
查看>>
express4.0源码解析
查看>>
func_get_args和func_num_args详解
查看>>
锚点偏移
查看>>
手把手教你webpack、react和node.js环境配置(上篇)
查看>>
Redis集群搭建与简单使用(四)
查看>>
scrapy 使用实例
查看>>
Laravel服务容器
查看>>
解读1.13.1 | 探究Docker Stack和可对接网络
查看>>
自动化部署打破混乱之墙 助力开发、运维、测试协同作战
查看>>
GitHub服务中断24小时11分钟事故分析报告\n
查看>>
华为敏捷DevOps实践:如何从Excel管理软件的方式中走出来
查看>>
安全狗:云时代的服务器安全守护者
查看>>
百度App网络深度优化系列(二):连接优化
查看>>