using UnityEngine; using UnityEngine.Rendering; using UnityEngine.SceneManagement; namespace AlicizaX.Runtime { /// /// 游戏对象帮助类 /// public static class GameObjectHelper { /// /// 销毁子物体 /// /// [UnityEngine.Scripting.Preserve] public static void RemoveChildren(GameObject go) { for (var i = go.transform.childCount - 1; i >= 0; i--) { Destroy(go.transform.GetChild(i).gameObject); } } /// /// 销毁游戏物体 /// /// [UnityEngine.Scripting.Preserve] public static void DestroyObject(this GameObject gameObject) { if (!ReferenceEquals(gameObject, null)) { if (Application.isEditor && !Application.isPlaying) { Object.DestroyImmediate(gameObject); return; } Object.Destroy(gameObject); } } /// /// 销毁游戏物体 /// /// public static void Destroy(GameObject gameObject) { gameObject.DestroyObject(); } /// /// 销毁游戏组件 /// /// [UnityEngine.Scripting.Preserve] public static void DestroyComponent(UnityEngine.Component component) { if (!ReferenceEquals(component, null)) { if (Application.isEditor && !Application.isPlaying) { Object.DestroyImmediate(component); return; } Object.Destroy(component); } } /// /// 在指定场景中查找特定名称的节点。 /// /// 场景名称。 /// 节点名称。 /// 找到的节点的GameObject实例,如果没有找到返回null。 public static GameObject FindChildGamObjectByName(string nodeName, string sceneName = null) { Scene scene; if (sceneName.IsNullOrWhiteSpace()) { scene = SceneManager.GetActiveScene(); } else { scene = SceneManager.GetSceneByName(sceneName); if (!scene.isLoaded) { return null; } } var rootObjects = scene.GetRootGameObjects(); foreach (var rootObject in rootObjects) { var result = FindChildGamObjectByName(rootObject, nodeName); if (result.IsNotNull()) { return result; } } return null; } /// /// 根据游戏对象名称查询子对象 /// /// /// /// [UnityEngine.Scripting.Preserve] public static GameObject FindChildGamObjectByName(GameObject gameObject, string name) { var transform = gameObject.transform.FindChildName(name); if (transform.IsNotNull()) { return transform.gameObject; } return null; } /// /// 创建游戏对象 /// /// /// /// [UnityEngine.Scripting.Preserve] public static GameObject Create(Transform parent, string name) { Debug.Assert(!ReferenceEquals(parent, null), nameof(parent) + " == null"); var gameObject = new GameObject(name); gameObject.transform.SetParent(parent); return gameObject; } /// /// 创建游戏对象 /// /// /// /// [UnityEngine.Scripting.Preserve] public static GameObject Create(GameObject parent, string name) { Debug.Assert(!ReferenceEquals(parent, null), nameof(parent) + " == null"); return Create(parent.transform, name); } /// /// 重置游戏对象的变换数据 /// /// /// [UnityEngine.Scripting.Preserve] public static void ResetTransform(GameObject gameObject) { gameObject.transform.localScale = Vector3.one; gameObject.transform.localPosition = Vector3.zero; gameObject.transform.localRotation = Quaternion.identity; } /// /// 设置对象的显示排序层 /// /// 游戏对象 /// 显示层 [UnityEngine.Scripting.Preserve] public static void SetSortingGroupLayer(GameObject gameObject, string sortingLayer) { SortingGroup[] sortingGroups = gameObject.GetComponentsInChildren(); foreach (SortingGroup sg in sortingGroups) { sg.sortingLayerName = sortingLayer; } } /// /// 设置对象的层 /// /// 游戏对象 /// 层 /// 是否设置子物体 [UnityEngine.Scripting.Preserve] public static void SetLayer(GameObject gameObject, int layer, bool children = true) { if (gameObject.layer != layer) { gameObject.layer = layer; } if (children) { Transform[] transforms = gameObject.GetComponentsInChildren(); foreach (var sg in transforms) { sg.gameObject.layer = layer; } } } } }