using System.Collections.Generic; using UnityEngine; namespace LS_LevelStreaming { public class LS_LevelStreamingSceneManager : MonoBehaviour { private static LS_LevelStreamingSceneManager s_instance; private Dictionary m_managedObjects = new Dictionary(); private List m_managedObjectsToRemoveAtFrameEnd = new List(); public static bool IsInstanceSet { get { return s_instance != null; } } public static LS_LevelStreamingSceneManager Instance { get { if (s_instance == null) { GameObject gameObject = new GameObject("LS_LevelStreamingSceneManager"); s_instance = gameObject.AddComponent(); } return s_instance; } } public int AddManagedObject(LS_ManagedObjectBase p_managedObj) { if (p_managedObj != null) { if (!m_managedObjects.ContainsKey(p_managedObj.ID)) { m_managedObjects.Add(p_managedObj.ID, p_managedObj); return p_managedObj.ID; } Debug.LogError("LS_LevelStreamingSceneManager: AddManagedObject: object with ID(" + p_managedObj.ID + ") is already added!"); return -1; } Debug.LogError("LS_LevelStreamingSceneManager: AddManagedObject: parameter is null!"); return -1; } public LS_ManagedObjectBase GetManagedObject(int p_managedObjID) { LS_ManagedObjectBase value; m_managedObjects.TryGetValue(p_managedObjID, out value); return value; } public bool RemoveManagedObject(int p_managedObjID) { LS_ManagedObjectBase managedObject = GetManagedObject(p_managedObjID); if (managedObject != null) { m_managedObjects.Remove(p_managedObjID); managedObject.m_onShow = null; managedObject.m_onHide = null; } return false; } public void RemoveManagedObjectAtFrameEnd(int p_managedObjID) { m_managedObjectsToRemoveAtFrameEnd.Add(p_managedObjID); } public void RemoveAllManagedObjects() { Dictionary.KeyCollection keys = m_managedObjects.Keys; int[] array = new int[keys.Count]; keys.CopyTo(array, 0); for (int i = 0; i < array.Length; i++) { RemoveManagedObject(array[i]); } } public void ForceShowAllManagedObjects() { foreach (KeyValuePair managedObject in m_managedObjects) { managedObject.Value.ForceShow(); } } public void ForceHideAllManagedObjects() { foreach (KeyValuePair managedObject in m_managedObjects) { managedObject.Value.ForceHide(); } } private void Update() { foreach (KeyValuePair managedObject in m_managedObjects) { managedObject.Value.Update(); } } private void LateUpdate() { foreach (int item in m_managedObjectsToRemoveAtFrameEnd) { RemoveManagedObject(item); } m_managedObjectsToRemoveAtFrameEnd.Clear(); } } }