using System.Collections.Generic; using UnityEngine; using UnityScene = UnityEngine.SceneManagement.Scene; namespace Projectiles { public static class SceneExtensions { // PUBLIC METHODS public static T GetComponent<T>(this UnityScene scene, bool includeInactive = false) where T : class { List<GameObject> roots = new List<GameObject>(); scene.GetRootGameObjects(roots); for (int i = 0, count = roots.Count; i < count; ++i) { T component = roots[i].GetComponentInChildren<T>(includeInactive); if (component != null) return component; } return default; } public static List<T> GetComponents<T>(this UnityScene scene, bool includeInactive = false) where T : class { List<T> allComponents = new List<T>(); List<T> objectComponents = new List<T>(); List<GameObject> sceneRootObjects = new List<GameObject>(); scene.GetRootGameObjects(sceneRootObjects); for (int i = 0, count = sceneRootObjects.Count; i < count; ++i) { sceneRootObjects[i].GetComponentsInChildren(includeInactive, objectComponents); allComponents.AddRange(objectComponents); objectComponents.Clear(); } return allComponents; } public static void GetComponents<T>(this UnityScene scene, List<T> components, bool includeInactive = false) where T : class { List<T> objectComponents = new List<T>(); List<GameObject> sceneRootObjects = new List<GameObject>(); scene.GetRootGameObjects(sceneRootObjects); components.Clear(); for (int i = 0, count = sceneRootObjects.Count; i < count; ++i) { sceneRootObjects[i].GetComponentsInChildren(includeInactive, objectComponents); components.AddRange(objectComponents); objectComponents.Clear(); } } } }