OvertakingLegend/Assets/UIFrameWork/Runtime/UIManager.cs

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);
}
}