using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using JetBrains.Annotations; using UnityEngine; using UnityEngine.SceneManagement; using Object = UnityEngine.Object; namespace MyFrameworkPure { public static class GameObjectTool { /// /// 查找所有物体 /// /// /// public static GameObject[] FindGameobjects(string name) { List goList = new List(); Transform[] trs = Object.FindObjectsOfType(); foreach (Transform tr in trs) { if (tr.GetHierarchyPath() == name) { goList.Add(tr.gameObject); } } return goList.ToArray(); } /// /// 查找物体(包括非激活状态) /// /// /// public static GameObject FindGameObject(string name) { float timeCounter = Time.realtimeSinceStartup; Transform[] trs = Resources.FindObjectsOfTypeAll(); Transform tr = trs.FirstOrDefault(x => Regex.IsMatch(x.GetHierarchyPath(),string.Format(@"^(.+/)*{0}$", name))); float delta = Time.realtimeSinceStartup - timeCounter; if (delta > 1) { Debug.LogError($"FindGameObject 方法执行时间为{delta},大于1秒的查询方法请谨慎使用!"); } return tr ? tr.gameObject : null; } /// /// 在指定场景中查找物体(包括非激活状态) /// /// /// /// public static GameObject FindGameObjectInScene(string name,Scene scene) { float timeCounter = Time.realtimeSinceStartup; Transform[] trs = Resources.FindObjectsOfTypeAll().Where(x=>x.gameObject.scene == scene).ToArray(); Transform tr = trs.FirstOrDefault(x => Regex.IsMatch(x.GetHierarchyPath(), string.Format(@"^(.+/)*{0}$", name))); float delta = Time.realtimeSinceStartup - timeCounter; if (delta > 1) { Debug.LogError($"FindGameObject 方法执行时间为{delta},大于1秒的查询方法请谨慎使用!"); } return tr ? tr.gameObject : null; } /// /// 查找物体(要求根物体处于激活状态) /// /// /// public static GameObject FindGameObjectQuick(string name) { int index = name.IndexOf('/'); string rootName = name.Substring(0, index); GameObject rootGameObject = GameObject.Find(rootName); if (!rootGameObject) return null; Transform target = rootGameObject.transform.Find(name.Substring(index + 1)); if (target) return target.gameObject; else return null; } /// /// 查找类型组件,包括激活和非激活组件 /// /// /// public static T FindObjectOfType() where T:Component { T[] trs = FindObjectsOfType(); return trs != null && trs.Length != 0 ? trs[0] : null; } public static Object FindObjectOfType(Type t) { Object[] objects = Resources.FindObjectsOfTypeAll(t); return objects.IsNullOrEmpty() ? null: objects[0]; } public static T[] FindObjectsOfType() where T : Component { return Resources.FindObjectsOfTypeAll().Where(x=>!string.IsNullOrEmpty(x.gameObject.scene.name)).ToArray(); } public static T[] FindObjectsOfTypeInScene(Scene scene) where T : Component { return Resources.FindObjectsOfTypeAll().Where(x => x.gameObject.scene == scene).ToArray(); } public static T FindObjectOfTypeInScene(Scene scene) where T : Component { return FindObjectsOfTypeInScene(scene).FirstOrDefault(); } private static Dictionary cacheDictionary; public static T FindTypeWithCache() where T : Component { if (cacheDictionary == null) cacheDictionary = new Dictionary(); Type t = typeof(T); if (cacheDictionary.ContainsKey(t)) { return cacheDictionary[t] as T; } return GameObjectTool.FindObjectOfType(); } public static void ClearFindCache() { cacheDictionary.Clear(); } public static GameObject FindGameObjectWithTag(string tag) { GameObject[] gos = Resources.FindObjectsOfTypeAll().Where(x=>x.tag.Equals(tag)).ToArray(); return gos.IsNullOrEmpty() ? null : gos[0]; } public static GameObject[] FindGameObjectsWithTag(string tag) { GameObject[] gos = Resources.FindObjectsOfTypeAll().Where(x => x.tag.Equals(tag)).ToArray(); return gos; } } }