public void GetInstance(string key, bool shared, Action <PopupBase> callback) { var data = new PopupLoadData(key, shared, callback); InputBlocker.Show(this); loadList.Enqueue(data); }
private IEnumerator LoadInstance(PopupLoadData loadData) { log.Debug("Instantiate '{0}'", loadData.key); ResourceRequest req = Resources.LoadAsync(loadData.key); yield return(req); GameObject prefab = req.asset as GameObject; if (prefab != null) { GameObject inst = Object.Instantiate(prefab); inst.SetActive(true); PopupBase p = inst.GetComponent <PopupBase>(); p.shared = loadData.shared; p.transform.SetParent(transform, false); if (loadData.shared) { instanceMap[loadData.key] = p; lruCache.Remove(loadData.key); lruCache.Add(loadData.key); // check cache size if (!IsImmortal(p.GetType())) { if (lruCache.Count > CACHE_SIZE) { string head = lruCache[0]; PopupBase oldPopup = instanceMap[head]; if (oldPopup.window.Status == UIPanelStatus.Hidden) { log.Debug("Destroy '{0}'", oldPopup.name); instanceMap.Remove(head); oldPopup.gameObject.DestroyEx(); lruCache.RemoveAt(0); } } } } loadData.Complete(p); } else { log.Error("Popup '{0}' is missing", loadData.key); loadData.Complete(null); } }
void Update() { if (currLoading != null) { if (currLoading.consumed) { currLoading = null; } else if (currLoading.shared) { PopupBase p = instanceMap.Get(currLoading.key); if (p != null && p.window.Status.IsShowing()) { currLoading = null; } } } if (loadList.Count > 0 && currLoading == null) { currLoading = loadList.Dequeue(); PopupBase p = null; if (currLoading.shared) { lruCache.Remove(currLoading.key); lruCache.Add(currLoading.key); p = instanceMap.Get(currLoading.key); } if (p != null) { currLoading.Complete(p); } else { StartCoroutine(LoadInstance(currLoading)); } } }