// 立即销毁对象 public static void DestroyImmediate(UnityEngine.Object obj) { if (obj as GameObject) { (obj as GameObject).transform.SetParent(null); // 这个仅仅是移除场景中 UtilApi.DestroyTexMat(obj as GameObject); } UnityEngine.Object.DestroyImmediate(obj); }
// bInstance 是通过 Instance 实例画出来的,否则是直接加载的磁盘资源,这种资源是受保护的,不能设置任何里面的值 public static void DestroyImmediate(UnityEngine.Object obj, bool allowDestroyingAssets, bool bInstance = true) { if (obj as GameObject) { if (bInstance) { (obj as GameObject).transform.SetParent(null); // 这个仅仅是移除场景中 UtilApi.DestroyTexMat(obj as GameObject); } } GameObject.DestroyImmediate(obj, allowDestroyingAssets); }
// 销毁对象 public static void Destroy(UnityEngine.Object obj) { if (obj != null) { if (obj as GameObject) { UtilApi.DestroyComponent(obj as GameObject); (obj as GameObject).transform.SetParent(null); // 这个仅仅是移除场景中 UtilApi.DestroyTexMat(obj as GameObject); } UnityEngine.Object.Destroy(obj); obj = null; } else { Ctx.m_instance.m_logSys.log("Destroy Object is null"); } }
// 纹理材质都是实例化,都对资源有引用计数,深度遍历释放资源 public static void DestroyTexMat(UnityEngine.GameObject go_) { Material mat = go_.GetComponent <Material>(); if (mat != null) { if (mat.mainTexture != null) { UtilApi.UnloadAsset(mat.mainTexture); mat.mainTexture = null; } UtilApi.UnloadAsset(mat); mat = null; } Image image = go_.GetComponent <Image>(); if (image != null) { if (image.sprite != null) { if (image.sprite.texture != null) { UtilApi.UnloadAsset(image.sprite.texture); } image.sprite = null; } image = null; } int childCount = go_.transform.childCount; int idx = 0; Transform childTrans = null; for (idx = 0; idx < childCount; ++idx) { childTrans = go_.transform.GetChild(idx); UtilApi.DestroyTexMat(childTrans.gameObject); } }