private bool IsLoaded <T>(IResourceReference reference, ResourceBase resource, out Item item, System.Action <T> callbackLoaded, System.Action callbackFailed) /*where T : Object*/ { var typeOf = typeof(T); var itemInner = this.loaded.FirstOrDefault(x => x.id == resource.GetId() && x.type == typeOf /*(x.@object == null || x.@object is T)*/); if (itemInner != null) { item = itemInner; if (itemInner.references.Contains(reference) == false) { itemInner.references.Add(reference); #if UNITY_EDITOR itemInner.referencesCount = itemInner.references.Count; #endif } else { //Debug.LogError("IsLoaded returns `true` but reference already in list.", reference); } if (itemInner.loaded == false) { this.OnItemCallback_INTERNAL <T>(itemInner, resource, callbackLoaded, callbackFailed); } else { if (itemInner.loadingResult == true) { callbackLoaded.Invoke((T)itemInner.loadedObject); } else { callbackFailed.Invoke(); } } return(true); } item = new Item() { id = resource.GetId(), type = typeOf, loadedObject = null, loaded = false, references = new List <IResourceReference>() { reference } }; #if UNITY_EDITOR item.referencesCount = 1; #endif this.loaded.Add(item); this.OnItemCallback_INTERNAL(item, resource, callbackLoaded, callbackFailed); return(false); }
private void Unload_INTERNAL(ILoadableResource resourceController, ResourceBase resource, bool resetController = true) { if (resource.loaded == false) { return; } //Debug.LogWarning("Unload: " + resource.GetId(), resourceController as MonoBehaviour); var item = this.loaded.FirstOrDefault(x => x.id == resource.GetId()); if (item != null) { if (item.references.Remove(resourceController as WindowComponent) == true) { this.loaded.RemoveAll(x => { if (x.id == resource.GetId() && x.references.Count == 0) { if (x.loadedObjectId < 0) { Object.Destroy(x.loadedObject); } return(true); } return(false); }); } } if (resetController == true) { var image = resourceController as IImageComponent; var source = image.GetImageSource(); if (source != null) { image.ResetImage(); resource.Unload(source.sprite); } else { var sourceRaw = image.GetRawImageSource(); if (sourceRaw != null) { image.ResetImage(); resource.Unload(sourceRaw.texture); } } } }
private System.Collections.Generic.IEnumerator <byte> LoadResource_INTERNAL <T>(ResourceBase resource, IResourceReference component, string customResourcePath, System.Action <T> callback, bool async) /*where T : Object*/ { if (resource.HasDirectRef() == true) { callback.Invoke(resource.GetDirectRef <T>()); yield break; } if (this.forceAsyncOff == true) { // Disabling async resource loading on Android, because for some reason Resources.LoadAsync() is terribly slow // as of Unity 5.6.2p2 (takes ~2 minutes to load some resources). async = false; } var task = new TaskItem(); task.id = resource.GetId(); task.async = async; task.resource = resource; task.component = component; task.customResourcePath = customResourcePath; task.onSuccess = (obj) => { T resultObj = default(T); if (obj is GameObject && typeof(T).HasBaseType(typeof(Component)) == true && typeof(T).HasBaseType(typeof(GameObject)) == false) { resultObj = (obj as GameObject).GetComponent <T>(); } else { //if (UnityEngine.UI.Windows.Constants.LOGS_ENABLED == true) UnityEngine.Debug.Log(typeof(T) + " << " + obj); resultObj = (T)obj; } callback.Invoke(resultObj); }; task.onFailed = () => { callback.Invoke(default(T)); }; #if UNITY_EDITOR this.tasks.Add(task); #endif //if (UnityEngine.UI.Windows.Constants.LOGS_ENABLED == true) UnityEngine.Debug.Log("Resource Task: " + task.resource.assetPath); var coroutine = this.StartTask <T>(task); while (coroutine.MoveNext() == true) { yield return(0); } task.Dispose(); #if UNITY_EDITOR this.tasks.RemoveAll(x => x.id == task.id); #endif }
private bool IsLoaded <T>(WindowComponent reference, ResourceBase resource, out Item item, System.Action <T> callback) where T : Object { var itemInner = this.loaded.FirstOrDefault(x => x.id == resource.GetId() /*(x.@object == null || x.@object is T)*/); if (itemInner != null) { item = itemInner; if (itemInner.references.Contains(reference) == false) { itemInner.references.Add(reference); } else { //Debug.LogError("IsLoaded returns `true` but reference already in list.", reference); } if (itemInner.loaded == false) { System.Action callbackInner = null; callbackInner = () => { itemInner.onObjectLoaded -= callbackInner; callback.Invoke(itemInner.@object as T); }; itemInner.onObjectLoaded += callbackInner; } else { callback(itemInner.@object as T); } return(true); } item = new Item() { id = resource.GetId(), @object = null, loaded = false, references = new List <WindowComponent>() { reference } }; this.loaded.Add(item); return(false); }
private IEnumerator LoadResource_INTERNAL <T>(ResourceBase resource, IImageComponent component, Graphic graphic, string customResourcePath, System.Action <T> callback) where T : Object { if (this.taskInterations == null) { this.taskInterations = new Dictionary <Graphic, int>(); } var iteration = 0; if (graphic != null) { if (this.taskInterations.TryGetValue(graphic, out iteration) == false) { this.taskInterations.Add(graphic, ++iteration); } } var task = new TaskItem(); task.id = resource.GetId(); task.resource = resource; task.component = component; task.graphic = graphic; task.customResourcePath = customResourcePath; task.onSuccess = (obj) => { if (graphic != null) { var iterationFailed = !(graphic == null || iteration == this.taskInterations[graphic]); if (iterationFailed == false) { callback.Invoke(obj as T); } else { task.onFailed.Invoke(); } } else { callback.Invoke(obj as T); } }; task.onFailed = () => { callback.Invoke(null); }; this.tasks.Add(task); //Debug.Log("Resource Task: " + task.resource.assetPath); yield return(this.StartCoroutine(this.StartTask <T>(task))); task.Dispose(); this.tasks.Remove(task); }
private System.Collections.Generic.IEnumerator <byte> LoadResource_INTERNAL <T>(ResourceBase resource, IResourceReference component, string customResourcePath, System.Action <T> callback, bool async) /*where T : Object*/ { var task = new TaskItem(); task.id = resource.GetId(); task.async = async; task.resource = resource; task.component = component; task.customResourcePath = customResourcePath; task.onSuccess = (obj) => { T resultObj = default(T); if (obj is GameObject && typeof(T).HasBaseType(typeof(Component)) == true && typeof(T).HasBaseType(typeof(GameObject)) == false) { resultObj = (obj as GameObject).GetComponent <T>(); } else { //Debug.Log(typeof(T) + " << " + obj); resultObj = (T)obj; } callback.Invoke(resultObj); }; task.onFailed = () => { callback.Invoke(default(T)); }; this.tasks.Add(task); //Debug.Log("Resource Task: " + task.resource.assetPath); task.coroutine = this.StartTask <T>(task); while (task.coroutine.MoveNext() == true) { yield return(0); } task.Dispose(); this.tasks.Remove(task); }
public static long GetKey(ResourceBase resource, IImageComponent component) { return(resource.GetId()); }
public static void UnloadResource_INTERNAL(IResourceReference resourceController, ResourceBase resource) { var item = WindowSystemResources.instance.loaded.FirstOrDefault(x => x.id == resource.GetId()); if (WindowSystemResources.Remove(item, resourceController, resource) == true) { MovieSystem.Unload(resourceController as IImageComponent, resource); } }
public static Item GetItem(ResourceBase resource) { return(WindowSystemResources.instance.loaded.FirstOrDefault(x => x.id == resource.GetId())); }
private void Unload_INTERNAL(ILoadableResource resourceController, ResourceBase resource, bool resetController = true) { /* * if (resource.loaded == false) { * * * return; * * }*/ //Debug.LogWarning("Unload: " + resource.GetId() + " :: " + resource.GetStreamPath(), resourceController as MonoBehaviour); var item = this.loaded.FirstOrDefault(x => x.id == resource.GetId()); if (WindowSystemResources.Remove(item, resourceController as WindowComponent, forced: true) == true) { //Debug.LogWarning("Unload movie: " + resource.GetId(), resourceController as MonoBehaviour); MovieSystem.Unload(resourceController as IImageComponent, resource); } /*if (item != null) { * * if (item.references.Remove(resourceController as WindowComponent) == true) { * * this.loaded.RemoveAll(x => { * * if (x.id == resource.GetId() && x.references.Count == 0) { * * if (x.loadedObjectId < 0) Object.Destroy(x.loadedObject); * return true; * * } * * return false; * * }); * * } * * }*/ if (resetController == true) { var image = resourceController as IImageComponent; var source = image.GetImageSource(); if (source != null) { image.ResetImage(); resource.Unload(source.sprite); } else { var sourceRaw = image.GetRawImageSource(); if (sourceRaw != null) { image.ResetImage(); resource.Unload(sourceRaw.texture); } } } }