using GameKit.Dependencies.Utilities.Types; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; namespace GameKit.Dependencies.Utilities { public static class Objects { /// /// Returns if an object has been destroyed from memory. /// /// /// public static bool IsDestroyed(this GameObject gameObject) { // UnityEngine overloads the == operator for the GameObject type // and returns null when the object has been destroyed, but // actually the object is still there but has not been cleaned up yet // if we test both we can determine if the object has been destroyed. return (gameObject == null && !ReferenceEquals(gameObject, null)); } /// /// Finds all objects in the scene of type. This method is very expensive. /// /// /// True if the scene must be fully loaded before trying to seek objects. /// public static List FindAllObjectsOfType(bool activeSceneOnly = true, bool requireSceneLoaded = false, bool includeDDOL = true, bool includeInactive = true) { List results = new(); for (int i = 0; i < SceneManager.sceneCount; i++) { Scene scene = SceneManager.GetSceneAt(i); //If to include only current scene. if (activeSceneOnly) { if (SceneManager.GetActiveScene() != scene) continue; } //If the scene must be fully loaded to seek objects within. if (!scene.isLoaded && requireSceneLoaded) continue; GameObject[] allGameObjects = scene.GetRootGameObjects(); for (int j = 0; j < allGameObjects.Length; j++) { results.AddRange(allGameObjects[j].GetComponentsInChildren(includeInactive)); } } //If to also include DDOL. if (includeDDOL) { GameObject ddolGo = DDOL.GetDDOL().gameObject; results.AddRange(ddolGo.GetComponentsInChildren(includeInactive)); } return results; } } }