unity 销毁物体Destroy、DestroyImmediate

本文通过一个具体的实例详细对比了Unity中Destroy与DestroyImmediate两种游戏物体删除方式的不同效果及适用场景。当使用Destroy删除游戏物体时,物体将在下一帧才被真正销毁,这可能导致预期之外的行为;而DestroyImmediate则会立即销毁物体并移除内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:Unity中使用Destroy删除游戏物体的大坑_zxy13826134783的博客-CSDN博客

Destroy(异步销毁):使用Destroy删除游戏物体,游戏物体并不会立即被删除,而是异步执行的,不会影响主线程的执行,说白了,就是它另外开一条道去执行了;该函数给物体加了一个标识符,物体还在内存中,在下一帧时才销毁并从内存中移除。

DestroyImmediate:立即销毁物体并移除内存。使用DestroyImmediate删除游戏物体,游戏物体立即被删除,代码顺序执行,影响主线程的执行

1、首先说一下需要做的功能:
(1)想要ImageTargetParent作为父物体,然后在它下边实例化一些随机的点,输出ImageTargetParent下第0个子物体的位置;
(2)点击“重置”按钮,删除ImageTargetParent下所有子物体,然后再随机实例化一些点,同样输出ImageTargetParent下第0个子物体的位置;

 实现方法如下:使用Destroy进行删除,可是发现并不能得到想要的结果,点击“重置”按钮,输出的结果一样。原因就是点击“重置”按钮后此时没有销毁原有的子物体,新增加的子物体索引在原有基础上继续增加,但是在Unity面板是看不到的,因为unity在下一帧时删除了原有的子物体。

using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour
{
    Transform targetPrefab;
    public Transform targetParent;
    public Button resetButton;
    void Start()
    {
        targetPrefab = Resources.Load<Transform>("prewfabs/ImageTarget1");
        resetButton.onClick.AddListener(ResetTargetObj);
        CreateTargetObjPosition(); 
    }
    void ResetTargetObj()
    {
        for (int i = 0; i < targetParent.childCount; i++)
        {
            Destroy(targetParent.GetChild(i).gameObject);
        }
        CreateTargetObjPosition();
    }
    void CreateTargetObjPosition()
    {
        int  targetNum = UnityEngine.Random.Range(3, 6);
        for (int i = 0; i < targetNum; i++)
        {
            Transform _tra = Instantiate(targetPrefab, targetParent);
            _tra.localPosition = Vector3.one * UnityEngine.Random.Range(3, 6);
            _tra.gameObject.SetActive(true);
        }
        Debug.Log("**1**:" + targetParent.transform.GetChild(0).localPosition);
    }
}

修改方法如下:将Destroy替换为DestroyImmediate。
注意:此时程序还是不能正常执行,因为一旦DestroyImmediate执行,那么targetParent.childCount的数量就会立刻减1 ,循环不成立;最简单的办法,将循环范围+i,查找子物体的索引变成“ 0 ”;

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值