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