直接上测试结果,方便后面使用:
GameObject被销毁时当前帧可以继续使用属性(gameObject,parent,transform等等)。
GameObject被销毁的下一帧判定null是相等的但是物体类型还是GameObject。
特别注意GameObject被销毁时当前帧 根据它的Parent获取childCount时是包含销毁的GameObject,所以这里计数不是想象的那样,如果使用childCount则在Destory前将父子关系解除
场景内未运行截图
image.png
Test.cs代码
//=====================================================
// - FileName: Test
// - Description:
// - Author: wangguoqing
// - Email: wangguoqing@hehemj.com
// - Created: 2017/12/13 17:12:17
// - CLR version: 4.0.30319.42000
// - UserName: Wang
// - (C) Copyright 2008 - 2015, hehehuyu,Inc.
// - All Rights Reserved.
//======================================================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Text;
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class Test : MonoBehaviour {
public GameObject obj;
void Start()
{
StartCoroutine(DestroyObj(obj));
}
IEnumerator DestroyObj(GameObject go)
{
Debug.Log("StartCoroutine");
Destroy(go);
Debug.Log("go:::" + go);
Debug.Log("go transform::1:::" + go.transform);
Debug.Log("type::1::"+ go.GetType().FullName);
//go = null;
yield return new WaitForEndOfFrame();
if (go == null)
{
Debug.Log("null===1");
}
if(go is GameObject)
{
Debug.Log("type::2::" + go.GetType().FullName);
}
Destroy(go);
if (go == null)
{
Debug.Log("null===2");
}
Debug.Log("go transform::2:::" + go.transform);//这里是77行
Destroy(go);
yield break;
}
}
运行结果
image.png将go=null这行代码注释放开后的运行结果:
image.png
根据结果说明:
1. gameObject在第一次Destroy后名没有立即被删除,当前帧可以继续使用;相关属性例如transform还可以用;在获取它Parent的所有物体时是能读到该gameObject属性的,并且Parent读取childCount是包含该gameObject计数的.
2. gameObject在第一次Destroy后的下一帧再使用时属性读取失败,应为Destroy的那一帧最终gameObject被销毁,然后go变量为null(这里的null并不是C#真正的null,因为go.transform报错信息有说明),但是Destroy(go)是不报错的,
网友评论