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;
}
}
}