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