/// <summary> /// 打开窗口 /// </summary> /// <typeparam name="W">窗口类型</typeparam> /// <param name="_windowId">窗口Id</param> /// <param name="_onCallback">回调</param> /// <param name="_parameters">参数组</param> public void OpenWindow <W>(int _windowId, UIWindowEntityEventHandler <W> _onCallback, params object[] _parameters) where W : AbsUIWindowView { OpenWindow <W>(new int[1] { _windowId }, _onCallback, _parameters); }
/// <summary> /// 检测窗口实例化是否完成 /// </summary> /// <typeparam name="W">窗口类型</typeparam> /// <param name="_hasInstanceCallback">是否有实例回调</param> /// <param name="_completeCallback">完成回调</param> /// <param name="_winCfgs">窗口配置</param> /// <param name="_callback">回调</param> /// <param name="_parameters">参数</param> public void CheckInstanceLoadComplete <W>( UIWindowHasInstanceEventHandle <W> _hasInstanceCallback, UIWindowCheckInstanceCompleteEventHandle <W> _completeCallback, XLS_Config_Table_UIWindowSetting[] _winCfgs, UIWindowEntityEventHandler <W> _callback, params object[] _parameters) where W : AbsUIWindowView { mWinCfgs = _winCfgs; mHasInstanceCallback = (XLS_Config_Table_UIWindowSetting cfg) => { return(_hasInstanceCallback(cfg)); }; mCompleteCallback = () => { _completeCallback(_winCfgs, _callback, _parameters); }; isRunCheck = true; gameObject.SetActive(true); OnResetName(); }
/// <summary> /// 获得窗口 /// </summary> /// <typeparam name="W">窗口类型</typeparam> /// <param name="_winCfgs">窗口配置</param> /// <param name="_callback">回调</param> /// <param name="_parameters">参数组</param> void OnGetWindow <W>(XLS_Config_Table_UIWindowSetting[] _winCfgs, UIWindowEntityEventHandler <W> _callback, params object[] _parameters) where W : AbsUIWindowView { W[] wins = new W[0]; if (_winCfgs != null && _winCfgs.Length > 0) { wins = new W[_winCfgs.Length]; for (int i = 0; i < _winCfgs.Length; i++) { if (mWindowHolderMaping.ContainsKey(_winCfgs[i].id)) { wins[i] = (W)mWindowHolderMaping[_winCfgs[i].id].window; } } } _callback(wins, _parameters); }
/// <summary> /// 打开窗口 /// </summary> /// <typeparam name="W">窗口类型</typeparam> /// <param name="_winCfgs">窗口配置</param> /// <param name="_callback">回调</param> /// <param name="_parameters">参数组</param> public void OnOpenWindow <W>(XLS_Config_Table_UIWindowSetting[] _winCfgs, UIWindowEntityEventHandler <W> _callback, params object[] _parameters) where W : AbsUIWindowView { OnCreateWindowHolder(_winCfgs); OnSettingWindowSerialize(_winCfgs); foreach (XLS_Config_Table_UIWindowSetting cfg in _winCfgs) { mWindowHolderMaping[cfg.id].SetTargetActive(true); } OnLoadWindowInMemory(_winCfgs, true, (cfgs, args) => { Dictionary <int, IAssetBundleOutput> memoryAssetResult = (Dictionary <int, IAssetBundleOutput>)args[0]; object[] memoryArgs = (object[])args[1]; UIWindowEntityEventHandler <W> call = (UIWindowEntityEventHandler <W>)memoryArgs[0]; object[] extArgs = (object[])memoryArgs[1]; OnInstanceWindow(cfgs, memoryAssetResult, call, extArgs); }, _callback, _parameters); }
/// <summary> /// 检测窗口实例化是否完成 /// </summary> /// <typeparam name="W">窗口类型</typeparam> /// <param name="_winCfgs">窗口配置</param> /// <param name="_callback">回调</param> /// <param name="_parameters">参数</param> void OnCheckInstanceComplete <W>(XLS_Config_Table_UIWindowSetting[] _winCfgs, UIWindowEntityEventHandler <W> _callback, params object[] _parameters) where W : AbsUIWindowView { List <int> winIds = new List <int>(); foreach (XLS_Config_Table_UIWindowSetting cfg in _winCfgs) { mWindowHolderMaping[cfg.id].ToggleSiblingIndex(); if (!winIds.Contains(cfg.id)) { winIds.Add(cfg.id); } } W[] windows = new W[winIds.Count]; for (int i = 0; i < winIds.Count; i++) { mWindowHolderMaping[winIds[i]].ToggleActive(); windows[i] = (W)mWindowHolderMaping[winIds[i]].window; } _callback(windows, _parameters); OnOpenWindowEventHandler?.Invoke(windows, _parameters); }
/// <summary> /// 检测窗口实例化是否完成 /// </summary> /// <typeparam name="W">窗口类型</typeparam> /// <param name="_winCfgs">窗口配置</param> /// <param name="_callback">回调</param> /// <param name="_parameters">参数</param> void OnCheckInstance <W>(XLS_Config_Table_UIWindowSetting[] _winCfgs, UIWindowEntityEventHandler <W> _callback, params object[] _parameters) where W : AbsUIWindowView { bool isRunCheck = false; foreach (UIWindowCheckInstance check in mUIWindowCheckInstanceMaping) { isRunCheck |= !check.isRunCheck; if (isRunCheck) { check.CheckInstanceLoadComplete <W>(OnUIWindowHasInstance <W>, OnCheckInstanceComplete, _winCfgs, _callback, _parameters); break; } } if (!isRunCheck) { GameObject go = new GameObject(); go.transform.SetParent(gameObject.transform); go.hideFlags = gameObject.hideFlags; UIWindowCheckInstance check = go.AddDynamicComponent <UIWindowCheckInstance>(); check.CheckInstanceLoadComplete <W>(OnUIWindowHasInstance <W>, OnCheckInstanceComplete, _winCfgs, _callback, _parameters); mUIWindowCheckInstanceMaping.Add(check); } }
/// <summary> /// 打开窗口 /// </summary> /// <typeparam name="W">窗口类型</typeparam> /// <param name="_folderIds">文件夹id组</param> /// <param name="_fileIds">文件id组</param> /// <param name="_onCallback">回调</param> /// <param name="_parameters">参数组</param> public void OpenWindow <W>(int[] _folderIds, int[] _fileIds, UIWindowEntityEventHandler <W> _onCallback, params object[] _parameters) where W : AbsUIWindowView { OpenWindow <W>(OnGetWindowSetting(_folderIds, _fileIds), _onCallback, _parameters); }
/// <summary> /// 打开窗口 /// </summary> /// <param name="_folderIds">文件夹id组</param> /// <param name="_fileIds">文件id组</param> /// <param name="_onCallback">回调</param> /// <param name="_parameters">参数组</param> public void OpenWindow(int[] _folderIds, int[] _fileIds, UIWindowEntityEventHandler <AbsUIWindowView> _onCallback, params object[] _parameters) { OpenWindow <AbsUIWindowView>(_folderIds, _fileIds, _onCallback, _parameters); }
/// <summary> /// 打开窗口 /// </summary> /// <param name="_windowId">窗口Id</param> /// <param name="_onCallback">回调</param> /// <param name="_parameters">参数组</param> public void OpenWindow(int _windowId, UIWindowEntityEventHandler <AbsUIWindowView> _onCallback, params object[] _parameters) { OpenWindow <AbsUIWindowView>(_windowId, _onCallback, _parameters); }
/// <summary> /// 关闭窗口 /// </summary> /// <typeparam name="W">窗口类型</typeparam> /// <param name="_folderId">文件夹id</param> /// <param name="_fileId">文件id</param> /// <param name="_onCallback">回调</param> /// <param name="_parameters">参数组</param> public void CloseWindow <W>(int _folderId, int _fileId, UIWindowEntityEventHandler <W> _onCallback, params object[] _parameters) where W : AbsUIWindowView { CloseWindow <W>(OnGetWindowSetting(_folderId, _fileId), _onCallback, _parameters); }
/// <summary> /// 关闭窗口 /// </summary> /// <param name="_folderId">文件夹id</param> /// <param name="_fileId">文件id</param> /// <param name="_onCallback">回调</param> /// <param name="_parameters">参数组</param> public void CloseWindow(int _folderId, int _fileId, UIWindowEntityEventHandler <AbsUIWindowView> _onCallback, params object[] _parameters) { CloseWindow <AbsUIWindowView>(_folderId, _fileId, _onCallback, _parameters); }
/// <summary> /// 关闭窗口 /// </summary> /// <typeparam name="W">窗口类型</typeparam> /// <param name="_windowIds">窗口Id组</param> /// <param name="_onCallback">回调</param> /// <param name="_parameters">参数组</param> public void CloseWindow <W>(int[] _windowIds, UIWindowEntityEventHandler <W> _onCallback, params object[] _parameters) where W : AbsUIWindowView { OnCloseWindow <W>(OnGetWindowSetting(_windowIds), _onCallback, _parameters); }
/// <summary> /// 关闭窗口 /// </summary> /// <param name="_windowIds">窗口Id组</param> /// <param name="_onCallback">回调</param> /// <param name="_parameters">参数组</param> public void CloseWindow(int[] _windowIds, UIWindowEntityEventHandler <AbsUIWindowView> _onCallback, params object[] _parameters) { CloseWindow <AbsUIWindowView>(_windowIds, _onCallback, _parameters); }
/// <summary> /// 关闭窗口 /// </summary> /// <typeparam name="W">窗口类型</typeparam> /// <param name="_winCfgs">窗口配置</param> /// <param name="_callback">回调</param> /// <param name="_parameters">参数组</param> void OnCloseWindow <W>(XLS_Config_Table_UIWindowSetting[] _winCfgs, UIWindowEntityEventHandler <W> _callback, params object[] _parameters) where W : AbsUIWindowView { List <int> closeWinIds = new List <int>(); Dictionary <int, int> sameLayerLessThenSiblingIndex = new Dictionary <int, int>(); List <int> lessThenSiblingIndex = new List <int>(); foreach (XLS_Config_Table_UIWindowSetting cfg in _winCfgs) { if (mWindowHolderMaping.ContainsKey(cfg.id)) { mWindowHolderMaping[cfg.id].SetTargetActive(false); if (!closeWinIds.Contains(cfg.id)) { closeWinIds.Add(cfg.id); } #region 统计需要隐藏的各层级的最大SiblingIndex switch (cfg.winCloseMode) { case enUIWindowCloseMode.WhenCloseHiddenSameLayerAndMoreThanSiblingIndex: if (!sameLayerLessThenSiblingIndex.ContainsKey(cfg.layer)) { sameLayerLessThenSiblingIndex.Add(cfg.layer, mWindowHolderMaping[cfg.id].windowSiblingIndex); } else { sameLayerLessThenSiblingIndex[cfg.layer] = Mathf.Max(sameLayerLessThenSiblingIndex[cfg.layer], mWindowHolderMaping[cfg.id].windowSiblingIndex); } break; case enUIWindowCloseMode.WhenCloseHiddenMoreThanSiblingIndex: if (!lessThenSiblingIndex.Contains(mWindowHolderMaping[cfg.id].windowSiblingIndex)) { lessThenSiblingIndex.Add(mWindowHolderMaping[cfg.id].windowSiblingIndex); } else { lessThenSiblingIndex[0] = Mathf.Max(lessThenSiblingIndex[0], mWindowHolderMaping[cfg.id].windowSiblingIndex); } break; } #endregion } } #region 设置要隐藏的窗口ID foreach (KeyValuePair <int, UIWindowHolder> holder in mWindowHolderMaping) { if ( sameLayerLessThenSiblingIndex.ContainsKey(holder.Value.winCfg.layer) && holder.Value.windowSiblingIndex < sameLayerLessThenSiblingIndex[holder.Value.winCfg.layer] ) { holder.Value.SetTargetActive(false); } if ( lessThenSiblingIndex.Count > 0 && holder.Value.windowSiblingIndex < lessThenSiblingIndex[0] ) { holder.Value.SetTargetActive(false); } } #endregion List <int> autoOpenWindows = OnGetWindowSerialize().GetAutoRestoreSequence(closeWinIds); foreach (int id in autoOpenWindows) { if (mWindowHolderMaping.ContainsKey(id)) { mWindowHolderMaping[id].SetTargetActive(true); } } foreach (UIWindowHolder holder in mWindowHolderMaping.Values) { holder.ToggleActive(); } W[] windows = new W[closeWinIds.Count]; for (int i = 0; i < closeWinIds.Count; i++) { windows[i] = (W)mWindowHolderMaping[closeWinIds[i]].window; } _callback?.Invoke(windows, _parameters); OnCloseWindowEventHandler?.Invoke(windows, _parameters); }
/// <summary> /// 实例化窗口 /// </summary> /// <typeparam name="W">窗口类型</typeparam> /// <param name="_winCfgs">窗口配置</param> /// <param name="_memoryAssetResult">内存结果</param> /// <param name="_callback">回调</param> /// <param name="_parameters">参数</param> void OnInstanceWindow <W>(XLS_Config_Table_UIWindowSetting[] _winCfgs, Dictionary <int, IAssetBundleOutput> _memoryAssetResult, UIWindowEntityEventHandler <W> _callback, params object[] _parameters) where W : AbsUIWindowView { OnCheckInstance <W>(_winCfgs, _callback, _parameters); //创建实例 foreach (XLS_Config_Table_UIWindowSetting cfg in _winCfgs) { if (!mWindowHolderMaping[cfg.id].isMarkLoadedWindowInstace) { mWindowHolderMaping[cfg.id].MarkLoadedWindowInstace(); _memoryAssetResult[cfg.id].Instantiate <GameObject>(false, (result) => { XLS_Config_Table_UIWindowSetting winCfg = (XLS_Config_Table_UIWindowSetting)result.extraParemeter[0]; GameObject prefab = (GameObject)result.asset; if (prefab != null) { prefab.name = winCfg.name + "[" + winCfg.id + "]"; Type type = Type.GetType(winCfg.name); W window = default(W); if (type == null) { window = (W)(AbsUIWindowView)prefab.AddDynamicComponent <UIXLuaWindow>(); } else { window = prefab.AddDynamicComponent <W>(type); } window.SetConfig(winCfg); window.OnCloseWindow += Window_OnCloseWindow; mWindowHolderMaping[winCfg.id].SetWindow(window); } }, cfg, _winCfgs, _callback, _parameters); } } }