Unity中的DestroyImmediate

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

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

看似没问题,直接使用了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<Transform> trans = new List<Transform>(GetTransform<Transform>());
 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<T> GetTransform<T>()
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值