码迷,mamicode.com
首页 > 其他好文 > 详细

Unity中的DestroyImmediate

时间:2014-08-21 16:37:24      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   使用   for   问题   

 在写编辑器的过程中,想要动态销毁场景里面的游戏体时,被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是携程返回,每帧都再调用。希望有高人解释一下。

Unity中的DestroyImmediate,布布扣,bubuko.com

Unity中的DestroyImmediate

标签:des   style   blog   http   color   使用   for   问题   

原文地址:http://www.cnblogs.com/dahaiwuliang/p/3927196.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!