예제 #1
0
        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();
        }
예제 #2
0
        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);
        }
예제 #3
0
        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--;
        }
예제 #4
0
        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);
        }
예제 #5
0
        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;
        }
예제 #6
0
        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);
                }
            }
        }
예제 #7
0
        /// <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);
        }
예제 #8
0
        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);
            }
        }
예제 #9
0
        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);
        }
예제 #10
0
        /// <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);
        }