private void OnOpen(CUILoadState uiState, params object[] args) { if (uiState.IsLoading) { uiState.OpenWhenFinish = true; uiState.OpenArgs = args; return; } KUIController uiBase = uiState.UIWindow; Action doOpenAction = () => { if (uiBase.gameObject.activeSelf) { uiBase.OnClose(); } uiBase.BeforeOpen(args, () => { uiBase.gameObject.SetActive(true); uiBase.OnOpen(args); if (OnOpenEvent != null) { OnOpenEvent(uiBase); } }); }; doOpenAction(); }
private void InitWindow(CUILoadState uiState, KUIController uiBase, bool open, params object[] args) { uiBase.OnInit(); if (OnInitEvent != null) { OnInitEvent(uiBase); } if (open) { OnOpen(uiState, args); } if (!open) { if (!uiState.IsStaticUI) { CloseWindow(uiBase.UIName); // Destroy return; } else { uiBase.gameObject.SetActive(false); } } uiState.OnUIWindowLoadedCallbacks(uiState, uiBase); }
private IEnumerator LoadUIAssetBundle(string name, CUILoadState openState) { LoadingUICount++; var request = new UILoadRequest(); yield return(KResourceModule.Instance.StartCoroutine(UiBridge.LoadUIAsset(openState, request))); GameObject uiObj = (GameObject)request.Asset; // 具体加载逻辑结束...这段应该放到Bridge里 uiObj.SetActive(false); uiObj.name = openState.TemplateName; KUIController uiBase = uiObj.AddComponent(openState.UIType) as KUIController; Debuger.Assert(uiBase); openState.UIWindow = uiBase; uiBase.UIName = uiBase.UITemplateName = openState.TemplateName; UiBridge.UIObjectFilter(uiBase, uiObj); openState.IsLoading = false; // Load完 InitWindow(openState, uiBase, openState.OpenWhenFinish, openState.OpenArgs); LoadingUICount--; }
private void OnDynamicWindowCallback(KUIController _ui, object[] _args) { string template = (string)_args[0]; string name = (string)_args[1]; GameObject uiObj = (GameObject)UnityEngine.Object.Instantiate(_ui.gameObject); uiObj.name = name; UiBridge.UIObjectFilter(_ui, uiObj); CUILoadState instanceUIState = UIWindows[name]; instanceUIState.IsLoading = false; KUIController uiBase = uiObj.GetComponent <KUIController>(); uiBase.UITemplateName = template; uiBase.UIName = name; instanceUIState.UIWindow = uiBase; object[] originArgs = new object[_args.Length - 2]; // 去除前2个参数 for (int i = 2; i < _args.Length; i++) { originArgs[i - 2] = _args[i]; } InitWindow(instanceUIState, uiBase, instanceUIState.OpenWhenFinish, originArgs); }
public IEnumerator LoadUIAsset(CUILoadState loadState, UILoadRequest request) { string path = string.Format("UI/{0}_UI{1}", loadState.TemplateName, KEngine.AppEngine.GetConfig("AssetBundleExt")); var assetLoader = KStaticAssetLoader.Load(path); loadState.UIResourceLoader = assetLoader; // 基本不用手工释放的 while (!assetLoader.IsCompleted) { yield return(null); } request.Asset = assetLoader.TheAsset; }
internal void OnUIWindowLoadedCallbacks(CUILoadState uiState, KUIController uiObject) { //if (openState.OpenWhenFinish) // 加载完打开 模式下,打开时执行回调 { while (uiState.CallbacksWhenFinish.Count > 0) { Action <KUIController, object[]> callback = uiState.CallbacksWhenFinish.Dequeue(); object[] _args = uiState.CallbacksArgsWhenFinish.Dequeue(); //callback(uiBase, _args); DoCallback(callback, _args); } } }
/// <summary> /// DynamicWindow专用, 不会自动加载,会提示报错 /// </summary> /// <param name="uiName"></param> /// <param name="callback"></param> /// <param name="args"></param> public void CallDynamicUI(string uiName, Action <KUIController, object[]> callback, params object[] args) { Debuger.Assert(callback); CUILoadState uiState; if (!UIWindows.TryGetValue(uiName, out uiState)) { Logger.LogError("找不到UIState: {0}", uiName); return; } CUILoadState openState = UIWindows[uiName]; openState.DoCallback(callback, args); }
private IEnumerator LoadUIAssetBundle(string name, CUILoadState openState, KCallback callback = null) { if (openState.UIResourceLoader != null) { openState.UIResourceLoader.Release(true);// now! Log.Info("Release UI ResourceLoader: {0}", openState.UIResourceLoader.Url); openState.UIResourceLoader = null; } LoadingUICount++; var request = new UILoadRequest(); yield return(KResourceModule.Instance.StartCoroutine(UiBridge.LoadUIAsset(openState, request))); GameObject uiObj = (GameObject)request.Asset; // 具体加载逻辑结束...这段应该放到Bridge里 uiObj.SetActive(false); uiObj.name = openState.TemplateName; var uiBase = UiBridge.CreateUIController(uiObj, openState.TemplateName); if (openState.UIWindow != null) { Log.Info("Destroy exist UI Window, maybe for reload"); GameObject.Destroy(openState.UIWindow.CachedGameObject); openState.UIWindow = null; } openState.UIWindow = uiBase; uiBase.UIName = uiBase.UITemplateName = openState.TemplateName; UiBridge.UIObjectFilter(uiBase, uiObj); openState.IsLoading = false; // Load完 InitWindow(openState, uiBase, openState.OpenWhenFinish, openState.OpenArgs); LoadingUICount--; if (callback != null) { callback(null); } }
public CUILoadState LoadWindow(string windowTemplateName, bool openWhenFinish, params object[] args) { if (UIWindows.ContainsKey(windowTemplateName)) { Logger.LogError("[LoadWindow]多次重复LoadWindow: {0}", windowTemplateName); } Debuger.Assert(!UIWindows.ContainsKey(windowTemplateName)); CUILoadState openState = new CUILoadState(windowTemplateName, windowTemplateName); openState.IsStaticUI = true; openState.OpenArgs = args; //if (openState.IsLoading) openState.OpenWhenFinish = openWhenFinish; KResourceModule.Instance.StartCoroutine(LoadUIAssetBundle(windowTemplateName, openState)); UIWindows.Add(windowTemplateName, openState); return(openState); }
/// <summary> /// // Dynamic动态窗口,复制基准面板 /// </summary> public CUILoadState OpenDynamicWindow(string template, string instanceName, params object[] args) { CUILoadState uiState = _GetUIState(instanceName); if (uiState != null) { OnOpen(uiState, args); return(uiState); } CUILoadState uiInstanceState; if (!UIWindows.TryGetValue(instanceName, out uiInstanceState)) // 实例创建 { uiInstanceState = new CUILoadState(template, instanceName); uiInstanceState.IsStaticUI = false; uiInstanceState.IsLoading = true; uiInstanceState.UIWindow = null; uiInstanceState.OpenWhenFinish = true; UIWindows[instanceName] = uiInstanceState; } CallUI(template, (_ui, _args) => { // _args useless CUILoadState uiTemplateState = _GetUIState(template); // 组合template和name的参数 和args外部参数 object[] totalArgs = new object[args.Length + 2]; totalArgs[0] = template; totalArgs[1] = instanceName; args.CopyTo(totalArgs, 2); OnDynamicWindowCallback(uiTemplateState.UIWindow, totalArgs); }); return(uiInstanceState); }