當我們想銷毀一個集合中的所有物體時
很容易想到會這么做
List<GameObject> goes = new List<GameObject>(); for (int i = 0; i < goes.Count; i++) { Destroy(goes[i]); }
用一個for循環
遍歷到所有的物體
然后將每個物體 i 銷毀
然而,再仔細想一下
當把第0個物體銷毀了
那原來的第1個物體,不就是第0個物體了嗎
按這個邏輯
不應該是Destroy(goes[0])嗎
對的,這個邏輯沒錯
問題就出在Destroy這個api身上
Destroy會在當前幀結束的時候再把物體銷毀
也就是說
當把第0個物體銷毀時,當前幀此物體還在
想銷毀下一個物體,自然是銷毀物體1,而不是物體0
所以,在銷毀前想要處理一些邏輯時
就需要注意到這一點
當然,也有辦法可以將物體立馬銷毀,而不是在當前幀結束時銷毀
DestroyImmediate
這個api可以執行立刻銷毀的操作
也就是說,如果用這個api寫文章最開始的邏輯,那么就是
List<GameObject> goes = new List<GameObject>(); for (int i = 0; i < goes.Count; i++) { DestroyImmediate(goes[0]); }
沒錯,這里的參數就是0了
當然,Destroy也有延遲銷毀的函數重載
Destroy(gameObject, 5);
這個API就是在5秒后再銷毀gameObject