2019-06-28Unity中刪除父物體下所有子物體

unity中關(guān)于刪除父物體下所有子物體,可以直接通過如下方式實(shí)現(xiàn):

public void DeleteItem()
    {
        for (int i = 0; i < transform.childCount; i++)
        {
            Destroy(transform.GetChild(i).gameObject);
        }
    }
private void Update()
    {
        if (Input.GetKeyDown(KeyCode.H))
        {
            DeleteItem();
        }
    }

或者將所有子物體存入一個(gè)List,再進(jìn)行刪除,如下:

public List<GameObject> itemList = new List<GameObject>();


    private void Awake()
    {
        Init();
    }

    public void Init()
    {
        for (int i = 0; i < transform.childCount; i++)
        {
            itemList.Add(transform.GetChild(i).gameObject);
        }
    }

    public void DeleteItem()
    {
        for (int i = 0; i < itemList.Count; i++)
        {
            Destroy(itemList[i]);
        }
    }


    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.H))
        {
            DeleteItem();
        }
    }

上述兩種方式,將代碼掛載在父物體上,運(yùn)行中按下H均可實(shí)現(xiàn)效果。
但是上述方法均會(huì)出現(xiàn)一個(gè)問題,在我們刪除完成之后去獲取父物體子物體的個(gè)數(shù),子物體數(shù)沒有發(fā)生改變,如下所示:

public void DeleteItem()
    {
        for (int i = 0; i < itemList.Count; i++)
        {
            Destroy(itemList[i]);            
        }
        Debug.Log(transform.childCount);
    }

以第二種方式為例,打印出結(jié)果如下:

image.png

image.png

可以發(fā)現(xiàn),打印出子物體數(shù)量并沒有改變, 原本推測(cè)原因是我們通過Destroy去刪除時(shí),此時(shí)GC沒有調(diào)用,然后通過手動(dòng)調(diào)用GC方式測(cè)試發(fā)現(xiàn)結(jié)果依舊沒有改變,再次查閱資料并進(jìn)行測(cè)試,發(fā)現(xiàn)原因?yàn)镈estory與DestroyImmediate的運(yùn)行方式有所不同,不同點(diǎn)如下(直接Copy過來了https://www.csdn.net/tags/MtjaQgysNzc2OC1ibG9n.html):

Destroy(異步銷毀):使用Destroy刪除游戲物體,游戲物體并不會(huì)立即被刪除,而是異步執(zhí)行的,不會(huì)影響主線程的執(zhí)行,說白了,就是它另外開一條道去執(zhí)行了;該函數(shù)給物體加了一個(gè)標(biāo)識(shí)符,物體還在內(nèi)存中,在下一幀時(shí)才銷毀并從內(nèi)存中移除。
DestroyImmediate:立即銷毀物體并移除內(nèi)存。使用DestroyImmediate刪除游戲物體,游戲物體立即被刪除,代碼順序執(zhí)行,影響主線程的執(zhí)行

如果是需要實(shí)時(shí)去改變子物體數(shù)量,可以用DestroyImmediate:

public void DeleteItem()
    {
        for (int i = 0; i < itemList.Count; i++)
        {
            //Destroy(itemList[i]);
            DestroyImmediate(itemList[i]);
        }
        Debug.Log(transform.childCount);
    }

此時(shí)刪除后,子物體數(shù)量為0:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一:什么是協(xié)同程序?答:在主線程運(yùn)行時(shí)同時(shí)開啟另一段邏輯處理,來協(xié)助當(dāng)前程序的執(zhí)行。換句話說,開啟協(xié)程就是開啟一個(gè)...
    CrixalisAs閱讀 2,234評(píng)論 1 7
  • 1. 準(zhǔn)備場(chǎng)景 下載并導(dǎo)入官方Space Shooter教程的范例素材包,我們僅使用其中的模型、材質(zhì)、貼圖、Pre...
    shimmery閱讀 6,694評(píng)論 0 16
  • 一:什么是協(xié)同程序? 答:在主線程運(yùn)行時(shí)同時(shí)開啟另一段邏輯處理,來協(xié)助當(dāng)前程序的執(zhí)行。換句話說,開啟協(xié)程就是開啟一...
    好怕怕閱讀 4,031評(píng)論 2 23
  • Unity技術(shù)面試題 一:什么是協(xié)同程序? 答:在主線程運(yùn)行時(shí)同時(shí)開啟另一段邏輯處理,來協(xié)助當(dāng)前程序的執(zhí)行。換句話...
    沐冉閱讀 3,023評(píng)論 1 19
  • 這個(gè)是我剛剛整理出的Unity面試題,為了幫助大家面試,同時(shí)幫助大家更好地復(fù)習(xí)Unity知識(shí)點(diǎn),如果大家發(fā)現(xiàn)有什么...
    編程小火雞閱讀 3,999評(píng)論 2 34

友情鏈接更多精彩內(nèi)容