close

前陣子再用Unity遇到了一個問題

public GameObject x ; 後,

如何把Instantiate 所產生出來的 x物件給刪除掉,該怎麼做?!

爬文後看到一般都是使用 Destroy(this.gameobject),來刪除物件,但是這個程式碼是運用在當這個Script,掛在這個產生出來的Object中,

但這時候如果Script是掛在Camera或某個GameObject時,並沒有要將這個物件刪除,只是想刪除Instantiate產生的x,這時候Destroy(this.gameobject),

就會把這個Camera或某個GameObject給刪掉!但這不是我們想要的結果!


於是個人就使用Destroy(x)的方式,想嘗試刪除Instantiate 所產生出來的物件,但是系統卻跳出Destroying assets is not permitted to avoid data loss

Google了很久,但大多都是英文,不然就是一堆看不懂的方法...實在不知道該怎麼解決

後來終於在無意中被我發現了原來有人這麼寫 Destroy(GameObject.Find("x(Clone)")),

原來原理是因為Instantiate所產生出來的物件,其實就像個影子(Clone),但Destroy(x)的方式,是在告訴程式想要殺了他本人,但事實上這個x本人並不存在Hierarchy中,他只是被我們拿來取樣的Object,所以沒有辦法砍了他。這時程示會以為你是想要砍掉他本人,所以才會告訴你他在Hierarchy中找不到這樣東西,建議如果你真的要砍掉他本人,可以DestroyImmediate (theObject, true);的方式,但使用這個後就糟了,因為他會把在Project裡面的本人給砍了,那我們拿誰來複製呢?!所以我們不能使用DestroyImmediate

而 Destroy(GameObject.Find("x(Clone)")),其實只是簡單的在告訴程式,你要刪掉這個x物件的影子。" "中所指定的,其實就是Instantiate所產生的x,在Hierarchy中的名字,

當使用Instantiate產生GameObject時,物件都名稱後面都會多個(Clone),所以讓程式去Find,找到這個GameObject影子名字的物件!


我想應該是因為對於許多老手來說這應該是很基本的道理,所以才沒有人分享怎麼排除Destroying assets is not permitted to avoid data loss的狀況,

所以如果有什麼更好的方式可以解決,也歡迎大家留言討論~

我這菜鳥在這邊獻醜了!

arrow
arrow

    平凡人 股海日常 發表在 痞客邦 留言(4) 人氣()