using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; namespace I2.Loc { public class ResourceManager : MonoBehaviour { private static ResourceManager mInstance; public List mBundleManagers = new List(); public UnityEngine.Object[] Assets; private Dictionary mResourcesCache = new Dictionary(); private bool mCleaningScheduled; public static ResourceManager pInstance { get { bool flag = mInstance == null; if (mInstance == null) { mInstance = (ResourceManager)UnityEngine.Object.FindObjectOfType(typeof(ResourceManager)); } if (mInstance == null) { GameObject gameObject = new GameObject("I2ResourceManager", typeof(ResourceManager)); gameObject.hideFlags |= HideFlags.HideAndDontSave; mInstance = gameObject.GetComponent(); SceneManager.sceneLoaded += MyOnLevelWasLoaded; } if (flag && Application.isPlaying) { UnityEngine.Object.DontDestroyOnLoad(mInstance.gameObject); } return mInstance; } } public static void MyOnLevelWasLoaded(Scene scene, LoadSceneMode mode) { LocalizationManager.UpdateSources(); } public T GetAsset(string Name) where T : UnityEngine.Object { T val = FindAsset(Name) as T; if (val != null) { return val; } return LoadFromResources(Name); } private UnityEngine.Object FindAsset(string Name) { if (Assets != null) { int i = 0; for (int num = Assets.Length; i < num; i++) { if (Assets[i] != null && Assets[i].name == Name) { return Assets[i]; } } } return null; } public bool HasAsset(UnityEngine.Object Obj) { if (Assets == null) { return false; } return Array.IndexOf(Assets, Obj) >= 0; } public T LoadFromResources(string Path) where T : UnityEngine.Object { if (string.IsNullOrEmpty(Path)) { return (T)null; } UnityEngine.Object value; if (mResourcesCache.TryGetValue(Path, out value) && value != null) { return value as T; } T val = (T)null; if (Path.EndsWith("]", StringComparison.OrdinalIgnoreCase)) { int num = Path.LastIndexOf("[", StringComparison.OrdinalIgnoreCase); int length = Path.Length - num - 2; string value2 = Path.Substring(num + 1, length); Path = Path.Substring(0, num); T[] array = Resources.LoadAll(Path); int i = 0; for (int num2 = array.Length; i < num2; i++) { if (array[i].name.Equals(value2)) { val = array[i]; break; } } } else { val = Resources.Load(Path); } if (val == null) { val = LoadFromBundle(Path); } if (val != null) { mResourcesCache[Path] = val; } if (!mCleaningScheduled) { Invoke("CleanResourceCache", 0.1f); mCleaningScheduled = true; } return val; } public T LoadFromBundle(string path) where T : UnityEngine.Object { int i = 0; for (int count = mBundleManagers.Count; i < count; i++) { if (mBundleManagers[i] != null) { T val = mBundleManagers[i].LoadFromBundle(path); if (val != null) { return val; } } } return (T)null; } public void CleanResourceCache() { mResourcesCache.Clear(); Resources.UnloadUnusedAssets(); CancelInvoke(); mCleaningScheduled = false; } } }