Files
JJBB/Assets/Project/Script/GUI/UIManager.cs
2024-08-23 15:49:34 +08:00

1356 lines
48 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using Games.Events;
using Games.GlobeDefine;
using Games.Scene;
using Module.Log;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using EventSystem = UnityEngine.EventSystems.EventSystem;
public class UIManager : MonoBehaviour
{
public delegate void OnOpenUIDelegate(bool bSuccess, object param);
private static UIManager m_instance;
[SerializeField] public RectTransform BaseUIRoot; // 位于UI最底层常驻场景基础交互
[SerializeField] public RectTransform BaseUIRootLeft; // 用于动画效果
[SerializeField] public RectTransform BaseUIRootRight; // 用于动画效果
[SerializeField] public RectTransform CameraTexture;
[SerializeField] public Canvas Canvas;
[SerializeField] public RectTransform DamageHightRoot;
[SerializeField] public RectTransform DeathUIRoot;
// public EventSystem EventSystemObj;
[SerializeField] public RectTransform GuideUIRoot;
[SerializeField] public RectTransform LoadingUIRoot;
[SerializeField] public RectTransform MenuPopUIRoot;
[SerializeField] public RectTransform MessageTipRoot;
[SerializeField] public RectTransform MessageUIRoot;
[SerializeField] public RectTransform PopUIRoot; // 位于UI上层弹出式互斥
[SerializeField] public RectTransform StoryUIRoot; // 故事背景层
[SerializeField] public RectTransform TipUIRoot; // 位于UI顶层弹出重要提示信息等
[SerializeField] public Camera UICamera;
[SerializeField] public RectTransform UIEffectRoot;
private readonly Dictionary<string, GameObject> m_dicBaseUI = new Dictionary<string, GameObject>();
private readonly Dictionary<string, GameObject> m_dicCacheUI = new Dictionary<string, GameObject>();
private readonly Dictionary<string, GameObject> m_dicDeathUI = new Dictionary<string, GameObject>();
private readonly Dictionary<string, GameObject> m_dicMenuPopUI = new Dictionary<string, GameObject>();
private readonly Dictionary<string, GameObject> m_dicMessageTipUI = new Dictionary<string, GameObject>();
private readonly Dictionary<string, GameObject> m_dicMessageUI = new Dictionary<string, GameObject>();
private readonly Dictionary<string, GameObject> m_dicPopUI = new Dictionary<string, GameObject>();
private readonly Dictionary<string, GameObject> m_dicStoryUI = new Dictionary<string, GameObject>();
private readonly Dictionary<string, GameObject> m_dicTipUI = new Dictionary<string, GameObject>();
private readonly Dictionary<string, int> m_dicWaitLoad = new Dictionary<string, int>();
private void Awake()
{
m_dicTipUI.Clear();
m_dicBaseUI.Clear();
m_dicPopUI.Clear();
m_dicStoryUI.Clear();
m_dicMenuPopUI.Clear();
m_dicMessageUI.Clear();
m_dicMessageTipUI.Clear();
m_dicDeathUI.Clear();
m_dicCacheUI.Clear();
m_instance = this;
DontDestroyOnLoad(this);
UICamera.depthTextureMode = DepthTextureMode.None;
UICamera.gameObject.EnsureComponent<UiCameraEventSender>();
}
/// <summary>
/// CanvasScaler希望的屏幕尺寸和真实屏幕像素不一样
/// </summary>
//public Vector2 canvasSize { get; private set; }
private void Start()
{
//var canvasScaler = GetComponent<CanvasScaler>();
//canvasSize = canvasScaler.referenceResolution;
SetupScreenOrientation();
EventDispatcher.Instance.Add(EventId.SceneMovie, OnSceneMovie);
}
private void OnDestroy()
{
if (!GameManager.applicationQuit)
{
m_instance = null;
EventDispatcher.Instance.Remove(EventId.SceneMovie, OnSceneMovie);
}
}
public static UIManager Instance()
{
return m_instance;
}
public void DestroySelf()
{
gameObject.SetActive(false);
Destroy(gameObject);
m_instance = null;
}
/// <summary>
/// 设置自动旋转屏幕
/// </summary>
private void SetupScreenOrientation()
{
Screen.orientation = ScreenOrientation.AutoRotation;
Screen.autorotateToLandscapeLeft = true;
Screen.autorotateToLandscapeRight = true;
Screen.autorotateToPortrait = false;
Screen.autorotateToPortraitUpsideDown = false;
}
private void OnSceneMovie(object args)
{
var start = (bool) args;
//Canvas.enabled = !start;
UICamera.enabled = !start;
}
// private void Update()
// {
// if (Application.platform == RuntimePlatform.Android && Input.GetKeyDown(KeyCode.Escape))
// {
// if (PlatformHelper.IsChannelHasExitDialog())
// PlatformHelper.ExitGame();
// else
// MessageBoxLogic.OpenOKCancelBox(4933, -1, () => { Application.Quit(); });
// }
// }
//clear ui
public void UnLoadScene()
{
DestroyInDictionary(m_dicBaseUI);
DestroyInDictionary(m_dicPopUI);
DestroyInDictionary(m_dicTipUI);
DestroyInDictionary(m_dicStoryUI);
DestroyInDictionary(m_dicDeathUI);
DestroyInDictionary(m_dicCacheUI);
//foreach (var uiData in m_dicMenuPopUI)
//{
// if (!uiData.Value.gameObject.activeSelf)
// {
// GameObject.Destroy(uiData.Value);
// _DestoryUIPath.Add(uiData.Key);
// }
//}
//for (int i = 0; i < _DestoryUIPath.Count; ++i)
//{
// m_dicMenuPopUI.Remove(_DestoryUIPath[i]);
//}
var uiKeyList = new List<string>();
// 关闭所有除CentreNotice以外的MessageUI MessageUIRoot节点保留不隐藏
foreach (var pair in m_instance.m_dicMessageUI)
if (UIPathData.m_DicUIName[pair.Key].closeAnyway || !pair.Value.gameObject.activeSelf)
uiKeyList.Add(pair.Key);
for (var i = 0; i < uiKeyList.Count; i++)
{
m_instance.CloseMessageUI(uiKeyList[i]);
m_instance.m_dicMessageUI.Remove(uiKeyList[i]);
}
uiKeyList.Clear();
foreach (var pair in m_instance.m_dicMessageTipUI)
if (UIPathData.m_DicUIName[pair.Key].closeAnyway)
uiKeyList.Add(pair.Key);
for (var i = 0; i < uiKeyList.Count; i++)
{
m_instance.CloseMessageTipUI(uiKeyList[i]);
m_instance.m_dicMessageTipUI.Remove(uiKeyList[i]);
}
if (m_dicBaseUI.ContainsKey(UIInfo.JumpGuideRoot.name))
{
DestroyUI(UIInfo.GuanningAreaRoot, m_dicBaseUI[UIInfo.GuanningAreaRoot.name]);
m_dicBaseUI.Remove(UIInfo.JumpGuideRoot.name);
}
// PVP
if (m_dicBaseUI.ContainsKey(UIInfo.PvpSceneInfo.name))
{
DestroyUI(UIInfo.PvpSceneInfo, m_dicBaseUI[UIInfo.PvpSceneInfo.name]);
m_dicBaseUI.Remove(UIInfo.PvpSceneInfo.name);
}
// 试炼副本左侧的进度面板
if (m_dicBaseUI.ContainsKey(UIInfo.TestingCopyInfo.name))
{
DestroyUI(UIInfo.TestingCopyInfo, m_dicBaseUI[UIInfo.TestingCopyInfo.name]);
m_dicBaseUI.Remove(UIInfo.TestingCopyInfo.name);
}
// 试炼副本-一夫当关副本
if (m_dicBaseUI.ContainsKey(UIInfo.BuffsStateInfo.name))
{
DestroyUI(UIInfo.BuffsStateInfo, m_dicBaseUI[UIInfo.BuffsStateInfo.name]);
m_dicBaseUI.Remove(UIInfo.BuffsStateInfo.name);
}
if (ResourcePool.Instance)
ResourcePool.Instance.ClearUIItems();
}
public void UnLoadUIForce()
{
//DestroyInDictionary(m_dicBaseUI, true);
DestroyInDictionary(m_dicPopUI, true);
DestroyInDictionary(m_dicTipUI, true);
DestroyInDictionary(m_dicStoryUI, true);
DestroyInDictionary(m_dicDeathUI, true);
DestroyInDictionary(m_dicCacheUI, true);
var uiKeyList = new List<string>();
// 关闭所有除CentreNotice以外的MessageUI MessageUIRoot节点保留不隐藏
foreach (var pair in m_instance.m_dicMessageUI)
if (UIPathData.m_DicUIName[pair.Key].closeAnyway || !pair.Value.gameObject.activeSelf)
uiKeyList.Add(pair.Key);
for (var i = 0; i < uiKeyList.Count; i++)
{
m_instance.CloseMessageUI(uiKeyList[i]);
m_instance.m_dicMessageUI.Remove(uiKeyList[i]);
}
if (ResourcePool.Instance)
ResourcePool.Instance.ClearUIItems();
}
private void DestroyInDictionary(IDictionary<string, GameObject> uiDictionary, bool isForce = false)
{
var destoryUiPath = new List<string>();
var closeUIPath = new List<UIPathData>();
foreach (var keyValue in uiDictionary)
{
var uiPath = UIPathData.m_DicUIName[keyValue.Key];
if (SystemInfo.graphicsMemorySize + SystemInfo.systemMemorySize < 1600 || isForce)
{
//内存+显存小于2G的,有点不够用了,直接销毁
//强力销毁
}
else
{
//不销毁不关闭
if (!uiPath.isDestroyOnUnloasScene && !uiPath.closeAnyway)
continue;
//仅关闭
if (!uiPath.isDestroyOnUnloasScene && uiPath.closeAnyway && keyValue.Value.activeSelf)
{
closeUIPath.Add(uiPath);
//CloseUI(uiPath);
continue;
}
}
//销毁
if (!keyValue.Value.activeSelf || uiPath.closeAnyway)
{
if (uiPath._IsBlurBackground) HideBlurBackGround(uiPath.name);
DestroyUI(uiPath, keyValue.Value);
destoryUiPath.Add(keyValue.Key);
}
}
for (var i = 0; i < destoryUiPath.Count; i++)
uiDictionary.Remove(destoryUiPath[i]);
for (var i = 0; i < closeUIPath.Count; i++)
CloseUI(closeUIPath[i]);
}
//特殊场景不显示部分UI例如PVP不显示ActiveBtns
private static bool CanShowUI(string uiName)
{
if (uiName == UIInfo.ActiveBtns.name || uiName == UIInfo.SuperBenefitFirstRechargeTip.name)
if (GameManager.gameManager.RunningScene == GameManager.gameManager.PlayerDataPool.pvpIfo._PvpBattleSceneId
|| GameManager.gameManager.RunningScene == GameManager.gameManager.PlayerDataPool.pvpIfo._PvpSceneId
|| GameManager.gameManager.RunningScene == GlobeVar.CROSSSERVERSCENEID)
return false;
return true;
}
// 展示UI根据类型不同触发不同行为
public static bool ShowUI(UIPathData pathData, OnOpenUIDelegate delOpenUI = null, object param = null,
bool defaultHide = false)
{
if (!m_instance)
{
LogModule.ErrorLog("game manager is not init");
return false;
}
if (!CanShowUI(pathData.name)) return false;
m_instance.AddLoadDicRefCount(pathData.name);
#if !UNITY_EDITOR && !UNITY_STANDALONE_WIN
if (pathData.uiType == UIPathData.UIType.TYPE_POP ||
pathData.uiType == UIPathData.UIType.TYPE_STORY ||
pathData.uiType == UIPathData.UIType.TYPE_TIP ||
pathData.uiType == UIPathData.UIType.TYPE_MENUPOP)
{
if (ProcessInput.Instance != null)
ProcessInput.Instance.ReleaseInput();
}
#endif
Dictionary<string, GameObject> curDic = null;
switch (pathData.uiType)
{
case UIPathData.UIType.TYPE_BASE:
case UIPathData.UIType.TYPE_BASE_LEFT:
case UIPathData.UIType.TYPE_BASE_RIGHT:
curDic = m_instance.m_dicBaseUI;
break;
case UIPathData.UIType.TYPE_POP:
curDic = m_instance.m_dicPopUI;
LuaUIManager.Instance.CloseAnyUI();
break;
case UIPathData.UIType.TYPE_STORY:
curDic = m_instance.m_dicStoryUI;
LuaUIManager.Instance.CloseAnyUI();
break;
case UIPathData.UIType.TYPE_TIP:
curDic = m_instance.m_dicTipUI;
break;
case UIPathData.UIType.TYPE_MENUPOP:
curDic = m_instance.m_dicMenuPopUI;
LuaUIManager.Instance.CloseAnyUI();
break;
case UIPathData.UIType.TYPE_MESSAGE:
curDic = m_instance.m_dicMessageUI;
break;
case UIPathData.UIType.TYPE_MESSAGETIP:
curDic = m_instance.m_dicMessageTipUI;
break;
case UIPathData.UIType.TYPE_DEATH:
curDic = m_instance.m_dicDeathUI;
break;
case UIPathData.UIType.TYPE_GUIDE:
curDic = m_instance.m_dicBaseUI;
break;
case UIPathData.UIType.TYPE_LOADING:
curDic = m_instance.m_dicPopUI;
break;
case UIPathData.UIType.TYPE_CAMERA_TEXTURE:
curDic = m_instance.m_dicBaseUI;
break;
default:
return false;
}
if (null == curDic) return false;
if (m_instance.m_dicCacheUI.ContainsKey(pathData.name))
{
if (!curDic.ContainsKey(pathData.name))
curDic.Add(pathData.name, m_instance.m_dicCacheUI[pathData.name]);
m_instance.m_dicCacheUI.Remove(pathData.name);
}
if (curDic.ContainsKey(pathData.name))
{
var uiGO = curDic[pathData.name];
if (uiGO.activeSelf && delOpenUI != null)
{
if ((int) pathData.uiType >= (int) UIPathData.UIType.TYPE_POP) SetIndexToBtm(uiGO.transform);
delOpenUI(true, param);
}
else
{
uiGO.SetActive(true);
var hash = new Hashtable();
hash.Add("UIData", pathData);
hash.Add("OnOpenUIDelegate", delOpenUI);
hash.Add("Param", param);
hash.Add("DefaultHide", defaultHide);
m_instance.DoAddUI(pathData.name, uiGO, hash);
}
return true;
}
m_instance.LoadUI(pathData, delOpenUI, param, defaultHide);
return true;
}
// 关闭UI根据类型不同触发不同行为
public static void CloseUI(UIPathData pathData)
{
if (null == m_instance)
return;
//int MaxCloseCount = PlayerPreferenceData.MaxCleanUICount;
//if (MaxCloseCount > 6)
//{
// MaxCloseCount = 6;
//}
//关闭MaxCloseCount次UI的时候立即GC
//if (++m_sCloseUICount >= MaxCloseCount)
//{
// Resources.UnloadUnusedAssets();
// GC.Collect();
// m_sCloseUICount = 0;
// // LogModule.DebugLog("CloseUI GC 1");
//}
//else
//{
// //活动侠客世界地图PK酒楼, 美人,背包界面,伙伴,每次打开都清理
// if (pathData.name == "ActivityController" ||
// pathData.name == "SwordsManController" ||
// pathData.name == "SceneMapRoot" ||
// pathData.name == "PKSetRoot" ||
// pathData.name == "Restaurant" ||
// pathData.name == "BelleController" ||
// pathData.name == "BackPackRoot" ||
// pathData.name == "PartnerAndMountRoot")
// {
// Resources.UnloadUnusedAssets();
// GC.Collect();
// m_sCloseUICount = 0;
// //LogModule.DebugLog("CloseUI GC 2 " + pathData.name);
// }
//}
//LogModule.DebugLog("m_sCloseUICount : " + m_sCloseUICount + " MaxCloseCount= " + MaxCloseCount);
//if (!m_GCTimerGo)
//{
// //关闭UI的时候如果玩家不会进行其他操作则顺手清理一下内存
// //如果关闭UI的时候玩家需要流畅的玩耍则要排除掉
// //目前先增加特例,之后等特例多了之后进行统一处理
// if (pathData.name != "NewPlayerGuidRoot")
// {
// m_GCTimerGo = true;
// m_GCWaitTime = Time.fixedTime;
// }
//}
m_instance.RemoveLoadDicRefCount(pathData.name);
switch (pathData.uiType)
{
case UIPathData.UIType.TYPE_BASE:
case UIPathData.UIType.TYPE_BASE_LEFT:
case UIPathData.UIType.TYPE_BASE_RIGHT:
m_instance.CloseBaseUI(pathData.name);
break;
case UIPathData.UIType.TYPE_POP:
m_instance.ClosePopUI(pathData.name);
break;
case UIPathData.UIType.TYPE_STORY:
m_instance.CloseStoryUI(pathData.name);
break;
case UIPathData.UIType.TYPE_TIP:
m_instance.CloseTipUI(pathData.name);
break;
case UIPathData.UIType.TYPE_MENUPOP:
m_instance.CloseMenuPopUI(pathData.name);
break;
case UIPathData.UIType.TYPE_MESSAGE:
m_instance.CloseMessageUI(pathData.name);
break;
case UIPathData.UIType.TYPE_MESSAGETIP:
m_instance.CloseMessageTipUI(pathData.name);
break;
case UIPathData.UIType.TYPE_DEATH:
m_instance.CloseDeathUI(pathData.name);
break;
case UIPathData.UIType.TYPE_GUIDE:
m_instance.CloseBaseUI(pathData.name);
break;
case UIPathData.UIType.TYPE_LOADING:
m_instance.ClosePopUI(pathData.name);
break;
case UIPathData.UIType.TYPE_CAMERA_TEXTURE:
m_instance.CloseBaseUI(pathData.name);
break;
}
if (pathData._IsBlurBackground) m_instance.HideBlurBackGround(pathData.name);
if (_WakingUIs.Contains(pathData.name))
_WakingUIs.Remove(pathData.name);
if (GuideLogic.Instance())
GuideLogic.Instance().UIClose(pathData.name);
}
public static void ClosePopUI()
{
var popKeys = new List<string>(m_instance.m_dicMenuPopUI.Keys);
for (var i = 0; i < popKeys.Count; ++i)
//if (UIPathData.m_DicUIName[popKeys[i]].closeAnyway)
//{
// m_instance.CloseMenuPopUI(popKeys[i]);
//}
//else if (!m_instance.m_dicMenuPopUI[popKeys[i]].activeSelf)
m_instance.CloseMenuPopUI(popKeys[i]);
popKeys = new List<string>(m_instance.m_dicPopUI.Keys);
for (var i = 0; i < popKeys.Count; ++i)
//if (UIPathData.m_DicUIName[popKeys[i]].closeAnyway)
//{
// m_instance.ClosePopUI(popKeys[i]);
//}
//else if (!m_instance.m_dicPopUI[popKeys[i]].activeSelf)
m_instance.ClosePopUI(popKeys[i]);
popKeys = new List<string>(m_instance.m_dicTipUI.Keys);
for (var i = 0; i < popKeys.Count; ++i)
//if (UIPathData.m_DicUIName[popKeys[i]].closeAnyway)
//{
// m_instance.CloseTipUI(popKeys[i]);
//}
//else if (!m_instance.m_dicTipUI[popKeys[i]].activeSelf)
m_instance.CloseTipUI(popKeys[i]);
}
// public static void CloseAll()
// {
// // private Dictionary<string, GameObject> m_dicTipUI = new Dictionary<string, GameObject>();
// //private Dictionary<string, GameObject> m_dicBaseUI = new Dictionary<string, GameObject>();
// //private Dictionary<string, GameObject> m_dicPopUI = new Dictionary<string, GameObject>();
// //private Dictionary<string, GameObject> m_dicStoryUI = new Dictionary<string, GameObject>();
// //private Dictionary<string, GameObject> m_dicMenuPopUI = new Dictionary<string, GameObject>();
// //private Dictionary<string, GameObject> m_dicMessageUI = new Dictionary<string, GameObject>();
// //private Dictionary<string, GameObject> m_dicDeathUI = new Dictionary<string, GameObject>();
// //private Dictionary<string, GameObject> m_dicCacheUI = new Dictionary<string, GameObject>();
//
// var popKeys = new List<string>(m_instance.m_dicMenuPopUI.Keys);
// for (var i = 0; i < popKeys.Count; ++i) m_instance.CloseMenuPopUI(popKeys[i]);
//
// popKeys = new List<string>(m_instance.m_dicBaseUI.Keys);
// for (var i = 0; i < popKeys.Count; ++i) m_instance.CloseBaseUI(popKeys[i]);
//
// popKeys = new List<string>(m_instance.m_dicStoryUI.Keys);
// for (var i = 0; i < popKeys.Count; ++i) m_instance.CloseStoryUI(popKeys[i]);
//
// popKeys = new List<string>(m_instance.m_dicMessageUI.Keys);
// for (var i = 0; i < popKeys.Count; ++i) m_instance.CloseMessageUI(popKeys[i]);
//
// popKeys = new List<string>(m_instance.m_dicDeathUI.Keys);
// for (var i = 0; i < popKeys.Count; ++i) m_instance.CloseDeathUI(popKeys[i]);
//
// popKeys = new List<string>(m_instance.m_dicPopUI.Keys);
// for (var i = 0; i < popKeys.Count; ++i) m_instance.ClosePopUI(popKeys[i]);
//
// popKeys = new List<string>(m_instance.m_dicTipUI.Keys);
// for (var i = 0; i < popKeys.Count; ++i) m_instance.CloseTipUI(popKeys[i]);
// }
public static T GetUIComponent<T>(UIPathData uiData)
{
var UIObj = GetUIGameObject(uiData);
if (UIObj != null)
{
var t = UIObj.GetComponent<T>();
if (t != null)
return t;
}
return default(T);
}
public static GameObject GetUIGameObject(UIPathData uiData)
{
if (null == m_instance) return null;
return m_instance.GetUIObj(uiData);
}
public GameObject GetUIObj(UIPathData uiData)
{
if (uiData != null)
{
GameObject UIObj;
Dictionary<string, GameObject> relativeDic = null;
switch (uiData.uiType)
{
case UIPathData.UIType.TYPE_BASE:
case UIPathData.UIType.TYPE_BASE_LEFT:
case UIPathData.UIType.TYPE_BASE_RIGHT:
relativeDic = m_dicBaseUI;
break;
case UIPathData.UIType.TYPE_POP:
relativeDic = m_dicPopUI;
break;
case UIPathData.UIType.TYPE_STORY:
relativeDic = m_dicStoryUI;
break;
case UIPathData.UIType.TYPE_TIP:
relativeDic = m_dicTipUI;
break;
case UIPathData.UIType.TYPE_MENUPOP:
relativeDic = m_dicMenuPopUI;
break;
case UIPathData.UIType.TYPE_MESSAGE:
relativeDic = m_dicMessageUI;
break;
case UIPathData.UIType.TYPE_MESSAGETIP:
relativeDic = m_dicMessageTipUI;
break;
case UIPathData.UIType.TYPE_DEATH:
relativeDic = m_dicDeathUI;
break;
case UIPathData.UIType.TYPE_GUIDE:
relativeDic = m_dicBaseUI;
break;
case UIPathData.UIType.TYPE_LOADING:
relativeDic = m_dicPopUI;
break;
case UIPathData.UIType.TYPE_CAMERA_TEXTURE:
relativeDic = m_dicBaseUI;
break;
}
if (relativeDic != null)
if (relativeDic.TryGetValue(uiData.name, out UIObj))
return UIObj;
}
return null;
}
private void DoAddUI(string uiName, GameObject curWindow, Hashtable hashParams)
{
var uiData = hashParams["UIData"] as UIPathData;
// 不可能继续执行后续任何操作了
if (uiData == null)
return;
if (m_dicWaitLoad.Remove(uiData.name))
{
GameObject showWindow = null;
var isNewWin = false;
var defaultHide = false;
if (hashParams.ContainsKey("DefaultHide")) defaultHide = (bool) hashParams["DefaultHide"];
if (null != curWindow)
{
Transform parentRoot = null;
Dictionary<string, GameObject> relativeDic = null;
switch (uiData.uiType)
{
case UIPathData.UIType.TYPE_BASE:
parentRoot = BaseUIRoot;
relativeDic = m_dicBaseUI;
break;
case UIPathData.UIType.TYPE_BASE_LEFT:
parentRoot = BaseUIRootLeft;
relativeDic = m_dicBaseUI;
break;
case UIPathData.UIType.TYPE_BASE_RIGHT:
parentRoot = BaseUIRootRight;
relativeDic = m_dicBaseUI;
break;
case UIPathData.UIType.TYPE_POP:
parentRoot = PopUIRoot;
relativeDic = m_dicPopUI;
break;
case UIPathData.UIType.TYPE_STORY:
parentRoot = StoryUIRoot;
relativeDic = m_dicStoryUI;
break;
case UIPathData.UIType.TYPE_TIP:
parentRoot = TipUIRoot;
relativeDic = m_dicTipUI;
break;
case UIPathData.UIType.TYPE_MENUPOP:
parentRoot = MenuPopUIRoot;
relativeDic = m_dicMenuPopUI;
break;
case UIPathData.UIType.TYPE_MESSAGE:
parentRoot = MessageUIRoot;
relativeDic = m_dicMessageUI;
break;
case UIPathData.UIType.TYPE_DEATH:
parentRoot = DeathUIRoot;
relativeDic = m_dicDeathUI;
break;
case UIPathData.UIType.TYPE_MESSAGETIP:
parentRoot = MessageTipRoot;
relativeDic = m_dicMessageTipUI;
break;
case UIPathData.UIType.TYPE_GUIDE:
parentRoot = GuideUIRoot;
relativeDic = m_dicBaseUI;
break;
case UIPathData.UIType.TYPE_LOADING:
parentRoot = LoadingUIRoot;
relativeDic = m_dicPopUI;
break;
case UIPathData.UIType.TYPE_CAMERA_TEXTURE:
parentRoot = CameraTexture;
relativeDic = m_dicBaseUI;
break;
}
if (uiData.uiType == UIPathData.UIType.TYPE_POP)
if (!defaultHide)
{
OnLoadNewPopUI(m_dicPopUI, uiData);
OnLoadNewPopUI(m_dicMenuPopUI, uiData);
}
if (uiData.uiType == UIPathData.UIType.TYPE_MENUPOP)
if (!defaultHide)
OnLoadNewPopUI(m_dicMenuPopUI, uiData);
if (null != relativeDic && relativeDic.ContainsKey(uiData.name))
{
relativeDic[uiData.name].SetActive(true);
showWindow = relativeDic[uiData.name];
if (uiData.uiType >= UIPathData.UIType.TYPE_POP) SetIndexToBtm(showWindow.transform);
//显示延迟的原因会导致模糊比UI出现的早模糊放到第二次显示的时候
if (uiData._IsBlurBackground) ShowBlurBackGround(uiData.name);
}
else if (null != parentRoot && null != relativeDic)
{
isNewWin = true;
showWindow = InitUIFromPrefab(curWindow, parentRoot.transform, (int) uiData.uiType, defaultHide);
if (showWindow != null)
{
relativeDic.Add(uiData.name, showWindow);
LogModule.DebugLog("Add UI:" + curWindow.name);
if (uiData.uiType == UIPathData.UIType.TYPE_MENUPOP) LoadMenuSubUIShield(showWindow);
if ((uiData.uiType == UIPathData.UIType.TYPE_MENUPOP ||
uiData.uiType == UIPathData.UIType.TYPE_POP)
&& uiData != UIInfo.ChatInfoRoot)
{
if (showWindow.GetComponent<CanvasGroup>() == null) showWindow.AddComponent<CanvasGroup>();
var animator = showWindow.AddComponent<Animator>();
animator.runtimeAnimatorController = _AnimPopUI.runtimeAnimatorController;
}
}
}
if (uiData.uiType == UIPathData.UIType.TYPE_STORY)
{
//BaseUIRoot.gameObject.SetActive(false);
//TipUIRoot.gameObject.SetActive(false);
//PopUIRoot.gameObject.SetActive(false);
//MenuPopUIRoot.gameObject.SetActive(false);
//MessageUIRoot.gameObject.SetActive(false);
//StoryUIRoot.gameObject.SetActive(true);
}
else if (uiData.uiType == UIPathData.UIType.TYPE_MENUPOP)
{
if (uiData.popAnim && !defaultHide)
StartCoroutine(ShowPopAnimUI(showWindow));
}
else if (uiData.uiType == UIPathData.UIType.TYPE_DEATH)
{
ReliveCloseOtherSubUI();
}
else if (uiData.uiType == UIPathData.UIType.TYPE_POP)
{
if (uiData.popAnim && !defaultHide)
StartCoroutine(ShowPopAnimUI(showWindow));
}
}
//if (null != fun)
{
var delOpenUI = hashParams["OnOpenUIDelegate"] as OnOpenUIDelegate;
if (delOpenUI != null)
{
if (!isNewWin)
{
delOpenUI(showWindow != null, hashParams["Param"]);
}
else
{
if (showWindow != null && !defaultHide)
StartCoroutine(ShowUILater(uiName, showWindow, delOpenUI, hashParams["Param"]));
else
delOpenUI(showWindow != null, hashParams["Param"]);
}
}
}
}
if (!uiData.archive)
LoadAssetBundle.Instance.UnloadAsset(uiData.path, uiData.name);
}
// 将物体置为本层级的最高层(遮住底层)
private static void SetIndexToBtm(Transform child)
{
var childCount = child.parent.childCount;
if (childCount > 0) child.SetSiblingIndex(childCount - 1);
}
public static GameObject InitUIFromPrefab(GameObject uiPrefab, Transform parentRoot, int uiType = -1,
bool defaultHide = false)
{
GameObject newWindow = null;
if (!defaultHide)
{
newWindow = Instantiate(uiPrefab, parentRoot.transform);
newWindow.SetActive(true);
}
else
{
uiPrefab.SetActive(false);
newWindow = Instantiate(uiPrefab, parentRoot.transform);
newWindow.SetActive(false);
}
if (uiType == -1 && parentRoot != null)
{
var windowSigns = parentRoot.GetComponentsInParent<WindowSign>();
if (windowSigns.Length > 0)
windowSigns[0].SetWndDirty();
}
if (null != newWindow)
{
if (uiType >= (int) UIPathData.UIType.TYPE_BASE_LEFT && uiType < (int) UIPathData.UIType.TYPE_MAX)
{
var wndSign = newWindow.GetComponent<WindowSign>();
if (wndSign == null) wndSign = newWindow.AddComponent<WindowSign>();
if (wndSign != null)
wndSign.Init(uiType);
}
//添加点击(Button Toggle)音效控制脚本
var playSound = newWindow.GetComponent<ButtonPlaySound>();
if (playSound == null)
newWindow.AddComponent<ButtonPlaySound>();
var rectTran = newWindow.GetComponent<RectTransform>();
if (rectTran != null)
{
rectTran.localPosition = Vector3.zero;
rectTran.localScale = Vector3.one;
rectTran.offsetMax = Vector2.zero;
rectTran.offsetMin = Vector2.zero;
}
}
if (uiType >= (int) UIPathData.UIType.TYPE_POP) SetIndexToBtm(newWindow.transform);
return newWindow;
}
private void ClosePopUI(string name)
{
StartCoroutine(OnClosePopUI(m_dicPopUI, name));
}
private void CloseStoryUI(string name)
{
if (TryDestroyUI(m_dicStoryUI, name))
{
BaseUIRoot.gameObject.SetActive(true);
TipUIRoot.gameObject.SetActive(true);
PopUIRoot.gameObject.SetActive(true);
MenuPopUIRoot.gameObject.SetActive(true);
MessageUIRoot.gameObject.SetActive(true);
StoryUIRoot.gameObject.SetActive(true);
}
}
private void CloseBaseUI(string name)
{
if (m_dicBaseUI.ContainsKey(name)) m_dicBaseUI[name].SetActive(false);
}
private void CloseTipUI(string name)
{
TryDestroyUI(m_dicTipUI, name);
}
private void CloseMenuPopUI(string name)
{
StartCoroutine(OnClosePopUI(m_dicMenuPopUI, name));
}
private void CloseMessageUI(string name)
{
TryDestroyUI(m_dicMessageUI, name);
}
private void CloseMessageTipUI(string name)
{
TryDestroyUI(m_dicMessageTipUI, name);
}
private void CloseDeathUI(string name)
{
if (TryDestroyUI(m_dicDeathUI, name))
{
// 关闭复活界面时 恢复节点的显示
m_instance.PopUIRoot.gameObject.SetActive(true);
m_instance.MenuPopUIRoot.gameObject.SetActive(true);
m_instance.TipUIRoot.gameObject.SetActive(true);
}
}
private void LoadUI(UIPathData uiData, OnOpenUIDelegate delOpenUI = null, object param1 = null,
bool defaultHide = false)
{
GameObject curWindow = null;
var hash = new Hashtable
{
{"UIData", uiData},
{"OnOpenUIDelegate", delOpenUI},
{"Param", param1},
{"DefaultHide", defaultHide}
};
LoadAssetBundle.Instance.LoadUI(uiData.path, uiData.name, DoAddUI, hash, uiData.archive);
}
private static void LoadMenuSubUIShield(GameObject newWindow)
{
//GameObject MenuSubUIShield = ResourceManager.InstantiateResource("Prefab/UI/MenuSubUIShield") as GameObject;
//if (MenuSubUIShield == null)
//{
// LogModule.ErrorLog("can not open MenuSubUIShield path not found");
// return;
//}
//MenuSubUIShield.transform.parent = newWindow.transform;
//MenuSubUIShield.transform.localPosition = Vector3.zero;
//MenuSubUIShield.transform.localScale = Vector3.one;
}
private static void LoadPopUIShield(GameObject newWindow)
{
if (GameManager.gameManager.RunningScene == (int) GameDefine_Globe.SCENE_DEFINE.SCENE_LOGIN ||
GameManager.gameManager.RunningScene == (int) GameDefine_Globe.SCENE_DEFINE.SCENE_LOADINGSCENE)
return;
var PopUIBlack = ResourceManager.InstantiateResource("Prefab/UI/PopUIBlack");
if (PopUIBlack == null)
{
LogModule.ErrorLog("can not open PopUIBlack path not found");
return;
}
PopUIBlack.transform.parent = newWindow.transform;
PopUIBlack.transform.localPosition = Vector3.zero;
PopUIBlack.transform.localScale = Vector3.one;
}
private GameObject AddObjToRoot(string name)
{
var obj = new GameObject();
obj.transform.parent = transform;
obj.transform.localPosition = Vector3.zero;
obj.transform.localScale = Vector3.one;
obj.name = name;
return obj;
}
private bool SubUIShow()
{
if (m_dicPopUI.Count + m_dicStoryUI.Count + m_dicTipUI.Count + m_dicMenuPopUI.Count > 0)
return true;
return false;
}
public static bool IsSubUIShow()
{
if (m_instance != null) return m_instance.SubUIShow();
return false;
}
private static void ReliveCloseOtherSubUI()
{
// 关闭所有PopUI
var uiKeyList = new List<string>();
foreach (var pair in m_instance.m_dicPopUI) uiKeyList.Add(pair.Key);
for (var i = 0; i < uiKeyList.Count; i++) m_instance.ClosePopUI(uiKeyList[i]);
uiKeyList.Clear();
// 关闭所有MenuPopUI
foreach (var pair in m_instance.m_dicMenuPopUI) uiKeyList.Add(pair.Key);
for (var i = 0; i < uiKeyList.Count; i++) m_instance.CloseMenuPopUI(uiKeyList[i]);
uiKeyList.Clear();
// 关闭所有TipUI
foreach (var pair in m_instance.m_dicTipUI) uiKeyList.Add(pair.Key);
for (var i = 0; i < uiKeyList.Count; i++) m_instance.CloseTipUI(uiKeyList[i]);
uiKeyList.Clear();
// 关闭所有除CentreNotice以外的MessageUI MessageUIRoot节点保留不隐藏
foreach (var pair in m_instance.m_dicMessageUI)
if (UIPathData.m_DicUIName[pair.Key].closeAnyway || !pair.Value.gameObject.activeSelf)
//if (!pair.Key.Contains("CentreNotice"))
uiKeyList.Add(pair.Key);
for (var i = 0; i < uiKeyList.Count; i++) m_instance.CloseMessageUI(uiKeyList[i]);
uiKeyList.Clear();
}
public static void NewPlayerGuideCloseSubUI()
{
// 关闭所有PopUI
foreach (var pair in m_instance.m_dicPopUI)
{
m_instance.ClosePopUI(pair.Key);
break;
}
// 关闭所有MenuPopUI
foreach (var pair in m_instance.m_dicMenuPopUI)
{
m_instance.CloseMenuPopUI(pair.Key);
break;
}
// 关闭所有TipUI
foreach (var pair in m_instance.m_dicTipUI)
{
m_instance.CloseTipUI(pair.Key);
break;
}
// 关闭所有MessageUI
// foreach (KeyValuePair<string, GameObject> pair in m_instance.m_dicMessageUI)
// {
// m_instance.CloseMessageUI(pair.Key);
// break;
// }
}
private void AddLoadDicRefCount(string pathName)
{
if (m_dicWaitLoad.ContainsKey(pathName))
m_dicWaitLoad[pathName]++;
else
m_dicWaitLoad.Add(pathName, 1);
}
private bool RemoveLoadDicRefCount(string pathName)
{
if (!m_dicWaitLoad.ContainsKey(pathName)) return false;
m_dicWaitLoad[pathName]--;
if (m_dicWaitLoad[pathName] <= 0) m_dicWaitLoad.Remove(pathName);
return true;
}
public void DestroyUI(UIPathData pathData, GameObject obj)
{
Destroy(obj);
LoadAssetBundle.Instance.UnloadAsset(pathData.path, pathData.name);
//StartCoroutine(DestroyUIDelay());
}
public void DestroyRawUi(string uiName, GameObject obj)
{
Destroy(obj);
var bundleName = LoadAssetBundle.BUNDLE_PATH_UI + uiName;
LoadAssetBundle.Instance.UnloadAsset(bundleName, uiName);
}
// IEnumerator DestroyUIDelay()
// {
// yield return null;
// Resources.UnloadUnusedAssets();
// }
private void OnLoadNewPopUI(Dictionary<string, GameObject> curList, UIPathData pathData)
{
if (curList == null) return;
var objToRemove = new List<string>();
if (curList.Count > 0)
{
objToRemove.Clear();
foreach (var objs in curList)
{
if (pathData.name == objs.Key) continue;
//objs.Value.SetActive(false);
objToRemove.Add(objs.Key);
}
for (var i = 0; i < objToRemove.Count; i++) StartCoroutine(OnClosePopUI(curList, objToRemove[i]));
}
}
private IEnumerator OnClosePopUI(Dictionary<string, GameObject> curList, string curName)
{
if (curList == null) yield break;
if (!curList.ContainsKey(curName)) yield break;
if (!UIPathData.m_DicUIName[curName].popAnim)
{
if (TryDestroyUI(curList, curName))
{
}
yield break;
}
HidePopAnimUI(curList[curName]);
yield return new WaitForSeconds(_AnimTime);
//_BackImg.enabled = false;
if (TryDestroyUI(curList, curName))
{
}
}
private bool TryDestroyUI(Dictionary<string, GameObject> curList, string curName)
{
if (curList == null)
return false;
GameObject target;
if (!curList.TryGetValue(curName, out target))
return false;
curList.Remove(curName);
UIPathData pathData;
if (UIPathData.m_DicUIName.TryGetValue(curName, out pathData))
{
if (pathData.isDestroyOnUnloasScene)
{
DestroyUI(pathData, target);
}
else
{
target.SetActive(false);
m_dicCacheUI.Add(curName, target);
}
}
else
{
DestroyRawUi(curName, target);
}
HideBlurBackGround(curName);
return true;
}
#region UI instance wake up
public static List<string> _WakingUIs = new List<string>();
public IEnumerator ShowUILater(string uiname, GameObject showUI, OnOpenUIDelegate delFunc, object param)
{
_WakingUIs.Add(uiname);
showUI.transform.localPosition = new Vector3(10000, 0, 0);
yield return null;
while (showUI != null && !showUI.activeSelf)
{
if (!_WakingUIs.Contains(uiname))
{
showUI.transform.localPosition = new Vector3(0, 0, 0);
yield break;
}
yield return null;
}
if (showUI != null && showUI.transform != null)
showUI.transform.localPosition = Vector3.zero;
delFunc(showUI, param);
_WakingUIs.Remove(uiname);
}
#endregion
#region cameraPos
private RectTransform _UICanvasRect;
public RectTransform UICanvasRect
{
get
{
if (_UICanvasRect == null) _UICanvasRect = gameObject.GetComponent<RectTransform>();
return _UICanvasRect;
}
}
public Camera GetWorldCamera()
{
Camera result = null;
if (SceneLogic.CameraController != null)
result = SceneLogic.CameraController.MainCamera;
if (result == null)
result = Camera.main;
return result;
}
/// <summary>
/// 视野坐标点转换为Ui坐标点
/// </summary>
/// <param name="viewPoint">视野坐标位置</param>
/// <param name="relativeToCenter">是否以中心为原点,否会用左下角为原点</param>
public Vector3 ViewPointToUiPoint(Vector3 viewPoint, bool relativeToCenter = true)
{
if (relativeToCenter)
viewPoint -= new Vector3(0.5f, 0.5f, 0f);
return new Vector3(viewPoint.x * UICanvasRect.sizeDelta.x, viewPoint.y * UICanvasRect.sizeDelta.y, viewPoint.z);
}
/// <summary>
/// 世界坐标点转化为Ui坐标点
/// </summary>
/// <param name="worldPos">世界坐标位置</param>
/// <param name="relativeToCenter">是否以中心为原点,否会用左下角为原点</param>
public Vector3 WorldToUiPoint(Vector3 worldPos, bool relativeToCenter = true)
{
//if (GameManager.gameManager.PlayerDataPool.IsInWeddingCar
// && GameManager.gameManager.PlayerDataPool.WCCamera)
// return WorldPosToUIPosByWCCamera(worldPos, relativeToCenter);
var viewPoint = GetWorldCamera().WorldToViewportPoint(worldPos); //1024
return ViewPointToUiPoint(viewPoint, relativeToCenter);
}
//婚车相机替带世界相机
//public Vector3 WorldPosToUIPosByWCCamera(Vector3 worldPos, bool relativeToCenter = true)
//{
// if (GameManager.gameManager.PlayerDataPool.IsInWeddingCar
// && GameManager.gameManager.PlayerDataPool.WCCamera)
// {
// var viewPoint = GameManager.gameManager.PlayerDataPool.WCCamera.WorldToViewportPoint(worldPos); //1024
// return ViewPointToUiPoint(viewPoint, relativeToCenter);
// }
// else
// return new Vector3();
//}
/// <summary>
/// 屏幕坐标点转化为Ui坐标点
/// </summary>
/// <param name="screenPoint">屏幕坐标位置</param>
/// <param name="relativeToCenter">是否以中心为原点,否会用左下角为原点</param>
public Vector2 ScreenPointToUiPoint(Vector2 screenPoint, bool relativeToCenter = true)
{
var viewPoint = new Vector3(screenPoint.x / Screen.width, screenPoint.y / Screen.height, 0f);
return ViewPointToUiPoint(viewPoint, relativeToCenter);
}
#endregion
#region ui anim
public Image _BackImg;
public Animator _AnimLeft;
public Animator _AnimRight;
public Animator _AnimPopUI;
public float _AnimTime = 0.01f;
private bool _IsBaseUIShow = true;
public void ShowBaseUI()
{
//_AnimLeft.Play("ShowLeft");
//_AnimRight.Play("ShowRight");
//_IsBaseUIShow = true;
}
public void HideBaseUI()
{
//_AnimLeft.Play("HideLeft");
//_AnimRight.Play("HideRight");
//_IsBaseUIShow = false;
}
public IEnumerator ShowPopAnimUI(GameObject popUI)
{
//Animator anim = popUI.GetComponent<Animator>();
//if (anim != null)
//{
// anim.Play("Show");
//}
//if (_IsBaseUIShow)
//{
// HideBaseUI();
//}
yield return new WaitForSeconds(_AnimTime);
//_BackImg.enabled = true;
}
public void HidePopAnimUI(GameObject popUI)
{
//Animator anim = popUI.GetComponent<Animator>();
//if (anim != null)
//{
// anim.Play("Hide");
//}
//if (!_IsBaseUIShow)
//{
// ShowBaseUI();
//}
}
#endregion
#region rayCast
//防死循环
private bool _RayCasting;
public void RayCastBebind(PointerEventData eventData)
{
//if (_RayCasting)
// return;
_RayCasting = true;
var raycastResults = new List<RaycastResult>();
EventSystem.current.RaycastAll(eventData, raycastResults);
if (raycastResults.Count > 0)
{
var pointClick = raycastResults[0].gameObject.GetComponent<Graphic>();
//if (ExecuteEvents.CanHandleEvent<IPointerClickHandler>(raycastResults[0].gameObject))
{
LogModule.DebugLog("RayCastItem:" + raycastResults[0].gameObject.name);
ExecuteEvents.ExecuteHierarchy<IPointerClickHandler>(raycastResults[0].gameObject, eventData,
(x, y) => x.OnPointerClick(eventData));
}
}
_RayCasting = false;
}
#endregion
#region ui background blur
public UICameraCopy _UIBackGround;
private readonly List<string> _ShowBlurUIs = new List<string>();
public void ShowBlurBackGround(string showUIPath)
{
if (_ShowBlurUIs.Count == 0)
{
_UIBackGround.gameObject.SetActive(true);
_UIBackGround.ShowBlur();
}
if (!_ShowBlurUIs.Contains(showUIPath)) _ShowBlurUIs.Add(showUIPath);
}
public void HideBlurBackGround(string showUIPath)
{
if (_ShowBlurUIs.Contains(showUIPath)) _ShowBlurUIs.Remove(showUIPath);
if (_ShowBlurUIs.Count == 0) _UIBackGround.HideBlur();
}
#endregion
}