using System; using System.Collections.Generic; namespace UnityEngine { public static class UnityEngageGameObjectExtension { public static void SafeDestroySelf( this Object obj) { if (obj == null) return; #if UNITY_EDITOR if (!Application.isPlaying) Object.DestroyImmediate(obj); else Object.Destroy(obj); #else Object.Destroy(obj); #endif } private static readonly List s_CachedTransforms = new List(); /// /// 获取或增加组件。 /// /// 要获取或增加的组件。 /// 目标对象。 /// 获取或增加的组件。 public static void DestroyComponent(this GameObject gameObject) where T : Component { T component = gameObject.GetComponent(); if (component != null) { Object.Destroy(component); } // return component; } /// /// 获取或增加组件。 /// /// 要获取或增加的组件。 /// 目标对象。 /// 获取或增加的组件。 public static T GetOrAddComponent(this GameObject gameObject) where T : Component { T component = gameObject.GetComponent(); if (component == null) { component = gameObject.AddComponent(); } return component; } /// /// 获取或增加组件。 /// /// 目标对象。 /// 要获取或增加的组件类型。 /// 获取或增加的组件。 public static Component GetOrAddComponent(this GameObject gameObject, Type type) { Component component = gameObject.GetComponent(type); if (component == null) { component = gameObject.AddComponent(type); } return component; } /// /// 获取 GameObject 是否在场景中。 /// /// 目标对象。 /// GameObject 是否在场景中。 /// 若返回 true,表明此 GameObject 是一个场景中的实例对象;若返回 false,表明此 GameObject 是一个 Prefab。 public static bool InScene(this GameObject gameObject) { return gameObject.scene.name != null; } /// /// 递归设置游戏对象的层次。 /// /// 对象。 /// 目标层次的编号。 public static void SetLayerRecursively(this GameObject gameObject, int layer) { gameObject.GetComponentsInChildren(true, s_CachedTransforms); foreach (var tf in s_CachedTransforms) { tf.gameObject.layer = layer; } s_CachedTransforms.Clear(); } } }