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);
        }
Пример #2
0
        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
        }
Пример #4
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
 public static long GetKey(ResourceBase resource, IImageComponent component)
 {
     return(resource.GetId());
 }
Пример #8
0
        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);
            }
        }
Пример #9
0
 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);
                    }
                }
            }
        }