411 lines
11 KiB
C#
411 lines
11 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Xml.Linq;
|
|
using Unity.VisualScripting;
|
|
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
using UnityEngine.EventSystems;
|
|
using UnityEngine.Rendering.PostProcessing;
|
|
|
|
/// <summary>
|
|
/// UI管理器
|
|
/// </summary>
|
|
public partial class UIManager : MBSingletonManager<UIManager>
|
|
{
|
|
/// <summary>
|
|
/// UI节点
|
|
/// </summary>
|
|
private Transform uiNode;
|
|
|
|
/// <summary>
|
|
/// UI相机
|
|
/// </summary>
|
|
[HideInInspector]public Camera uICamera;
|
|
|
|
/// <summary>
|
|
/// 管理所有UI画布组
|
|
/// </summary>
|
|
private CanvasGroup allUICG;
|
|
|
|
public PostProcessVolume postProcessVolume;
|
|
public PostProcessLayer processLayer;
|
|
|
|
/// <summary>
|
|
/// UI列表
|
|
/// </summary>
|
|
public List<UIBaseClass> uIList = new List<UIBaseClass>();
|
|
|
|
private void Awake()
|
|
{
|
|
Init();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 初始化
|
|
/// </summary>
|
|
private void Init()
|
|
{
|
|
uiNode = transform.Find("UINode");
|
|
uICamera = transform.Find("UICamera").GetComponent<Camera>();
|
|
allUICG=GetComponent<CanvasGroup>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 异步展示UI
|
|
/// </summary>
|
|
public void AsynShowUI<T>(UnityAction<T> callback = null) where T : UIBaseClass
|
|
{
|
|
string uIName = typeof(T).Name;
|
|
T uI;
|
|
uI = GetUI<T>();
|
|
if (uI != null)
|
|
{
|
|
uI.gameObject.SetActive(true);
|
|
uI.ShowPanelAnimation();
|
|
uI.OnShow();
|
|
callback?.Invoke(uI);
|
|
}
|
|
else
|
|
{
|
|
AsynGenerateUI<T>(uIName, (uIBaseClass) =>
|
|
{
|
|
uI = uIBaseClass;
|
|
UICorrection(uI.transform, uIName);
|
|
uI.ShowPanelAnimation();
|
|
uI.OnShow();
|
|
uIList.Add(uI);
|
|
callback?.Invoke(uI);
|
|
});
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 在Resources加载UI
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
/// <param name="callback"></param>
|
|
public void ResourcesShowUI<T>(UnityAction<T> callback = null) where T : UIBaseClass
|
|
{
|
|
string uIName = typeof(T).Name;
|
|
T uI;
|
|
uI = GetUI<T>();
|
|
if (uI != null)
|
|
{
|
|
uI.gameObject.SetActive(true);
|
|
uI.ShowPanelAnimation();
|
|
uI.OnShow();
|
|
callback?.Invoke(uI);
|
|
}
|
|
else
|
|
{
|
|
uI = Instantiate(Resources.Load<GameObject>(uIName)).GetComponent<T>();
|
|
UICorrection(uI.transform, uIName);
|
|
uI.ShowPanelAnimation();
|
|
uI.OnShow();
|
|
uIList.Add(uI);
|
|
callback?.Invoke(uI);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 异步展示UI
|
|
/// </summary>
|
|
public void AsynShowUI(string uIName,UnityAction<UIBaseClass> callback)
|
|
{
|
|
UIBaseClass uI = uIList.Find(s => s.name == uIName);
|
|
if (uI != null)
|
|
{
|
|
uI.gameObject.SetActive(true);
|
|
uI.ShowPanelAnimation();
|
|
uI.OnShow();
|
|
callback?.Invoke(uI);
|
|
}
|
|
else
|
|
{
|
|
AsynGenerateUI<UIBaseClass>(uIName, (uIBaseClass) =>
|
|
{
|
|
uI = uIBaseClass;
|
|
UICorrection(uI.transform, uIName);
|
|
uI.ShowPanelAnimation();
|
|
uI.OnShow();
|
|
uIList.Add(uI);
|
|
callback?.Invoke(uI);
|
|
});
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 预加载UI
|
|
/// </summary>
|
|
public void PreloadedUI<T>()where T : UIBaseClass
|
|
{
|
|
string uIName = typeof(T).Name;
|
|
T uI;
|
|
AsynGenerateUI<T>(uIName, (uiObj) =>
|
|
{
|
|
uI = uiObj;
|
|
UICorrection(uI.transform, uIName);
|
|
uI.gameObject.SetActive(false);
|
|
uI.OnShow();
|
|
uIList.Add(uI);
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 关闭UI
|
|
/// </summary>
|
|
public void HideUI<T>() where T : UIBaseClass
|
|
{
|
|
UIBaseClass uI;
|
|
uI = GetUI<T>();
|
|
if (uI != null)
|
|
{
|
|
uI.OnHide();
|
|
uI.HidePanel(() =>
|
|
{
|
|
uI.gameObject.SetActive(false);
|
|
});
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("关闭_没有这个UI:" + name);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 关闭UI
|
|
/// </summary>
|
|
public void HideUI(string uIName)
|
|
{
|
|
UIBaseClass uI = uIList.Find(s => s.name == uIName);
|
|
if (uI != null)
|
|
{
|
|
uI.OnHide();
|
|
uI.HidePanel(() =>
|
|
{
|
|
uI.gameObject.SetActive(false);
|
|
});
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("关闭_没有这个UI:" + name);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 关闭所有UI
|
|
/// </summary>
|
|
/// <param name="retainUI">保留的UI</param>
|
|
public void HideAll(List<string> retainUI)
|
|
{
|
|
bool shouldRetain=false;
|
|
for (int i = uIList.Count - 1; i >= 0; i--)
|
|
{
|
|
if (retainUI != null && retainUI.Contains(uIList[i].name))
|
|
{
|
|
shouldRetain = true;
|
|
}
|
|
|
|
if (!shouldRetain)
|
|
{
|
|
uIList[i].HidePanel(() =>
|
|
{
|
|
uIList[i].gameObject.SetActive(false);
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除UI
|
|
/// </summary>
|
|
public void DeleteUI<T>() where T : UIBaseClass
|
|
{
|
|
UIBaseClass uI;
|
|
uI = GetUI<T>();
|
|
if (uI != null)
|
|
{
|
|
uI.OnDelete();
|
|
if (uI.gameObject.activeInHierarchy)
|
|
{
|
|
uI.HidePanel(() =>
|
|
{
|
|
uIList.Remove(uI);
|
|
Destroy(uI.gameObject);
|
|
});
|
|
}
|
|
else
|
|
{
|
|
uIList.Remove(uI);
|
|
Destroy(uI.gameObject);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除UI
|
|
/// </summary>
|
|
public void DeleteUI(string uIName)
|
|
{
|
|
UIBaseClass uI= uIList.Find(s => s.name == uIName);
|
|
if (uI != null)
|
|
{
|
|
uI.OnDelete();
|
|
if (uI.gameObject.activeInHierarchy)
|
|
{
|
|
uI.HidePanel(() =>
|
|
{
|
|
uIList.Remove(uI);
|
|
Destroy(uI.gameObject);
|
|
});
|
|
}
|
|
else
|
|
{
|
|
uIList.Remove(uI);
|
|
Destroy(uI.gameObject);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("删除_没有这个UI:" + name);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除所有UI
|
|
/// </summary>
|
|
/// <param name="retainUI">保留UI</param>
|
|
public void DestroyAll(List<string> retainUI)
|
|
{
|
|
bool shouldRetain;
|
|
for (int i = uIList.Count - 1; i >= 0; i--)
|
|
{
|
|
shouldRetain = retainUI.Contains(uIList[i].name);
|
|
|
|
if (!shouldRetain)
|
|
{
|
|
uIList[i].HidePanel(() =>
|
|
{
|
|
Destroy(uIList[i].gameObject);
|
|
uIList.RemoveAt(i);
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 得到UI
|
|
/// </summary>
|
|
public T GetUI<T>() where T : UIBaseClass
|
|
{
|
|
string uIName = typeof(T).Name;
|
|
for (int i = 0; i < uIList.Count; i++)
|
|
{
|
|
if (uIName == uIList[i].name)
|
|
{
|
|
return uIList[i] as T;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 异步生成UI
|
|
/// </summary>
|
|
private void AsynGenerateUI<T>(string name, UnityAction<T> callback)
|
|
{
|
|
YooAssetManager.Instance.LoadAssetAsync<GameObject>(PackagesName.GameData, name, (uiObj) =>
|
|
{
|
|
T uiBaseClass = Instantiate(uiObj).GetComponent<T>();
|
|
callback(uiBaseClass);
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
///给控件添加自定义事件监听
|
|
/// </summary>
|
|
/// <param name="control">控件</param>
|
|
/// <param name="type">监听类型</param>
|
|
/// <param name="callBack">回调</param>
|
|
public void AddCustomEventListener(UIBehaviour control,EventTriggerType type,UnityAction<BaseEventData> callBack)
|
|
{
|
|
EventTrigger trigger = control.GetComponent<EventTrigger>();
|
|
if(trigger==null)
|
|
{
|
|
trigger = control.gameObject.AddComponent<EventTrigger>();
|
|
}
|
|
EventTrigger.Entry entry = new EventTrigger.Entry();
|
|
entry.eventID = type;
|
|
entry.callback.AddListener(callBack);
|
|
trigger.triggers.Add(entry);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 移除控件的自定义事件监听
|
|
/// </summary>
|
|
/// <param name="control">控件</param>
|
|
/// <param name="type">监听类型</param>
|
|
/// <param name="callBack">回调</param>
|
|
public void RemoveCustomEventListener(UIBehaviour control, EventTriggerType type)
|
|
{
|
|
EventTrigger trigger = control.GetComponent<EventTrigger>();
|
|
if (trigger != null)
|
|
{
|
|
// 遍历当前的所有触发器事件
|
|
foreach (var entry in trigger.triggers)
|
|
{
|
|
if (entry.eventID == type)
|
|
{
|
|
// 移除回调
|
|
entry.callback.RemoveAllListeners();
|
|
// 如果没有其他回调函数,移除该事件条目
|
|
if (entry.callback.GetPersistentEventCount() == 0)
|
|
{
|
|
trigger.triggers.Remove(entry);
|
|
break; // 一旦移除成功,跳出循环
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// UI矫正
|
|
/// </summary>
|
|
private void UICorrection(Transform uI, string uIName)
|
|
{
|
|
uI.name = uIName;
|
|
uI.transform.SetParent(uiNode);
|
|
uI.transform.localPosition = Vector3.zero;
|
|
uI.transform.localScale = Vector3.one;
|
|
(uI.transform as RectTransform).offsetMax = Vector3.zero;
|
|
(uI.transform as RectTransform).offsetMin = Vector3.zero;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 全部失效或开启
|
|
/// </summary>
|
|
public void AllLapseInitiate(bool isAllLapse)
|
|
{
|
|
allUICG.alpha = isAllLapse==true?1:0;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 设置Voluem
|
|
/// </summary>
|
|
/// <param name="isShow"></param>
|
|
public void SetPostProcessVolume(bool isShow)
|
|
{
|
|
postProcessVolume.isGlobal = isShow;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除后处理
|
|
/// </summary>
|
|
public void DesProcess()
|
|
{
|
|
Destroy(postProcessVolume);
|
|
Destroy(processLayer);
|
|
}
|
|
}
|