Files
5.24BuYu/Assets/Framework/Tool/UITool/SubUIManager.cs
T

147 lines
4.3 KiB
C#
Raw Normal View History

2025-12-11 16:40:24 +08:00
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
/// <summary>
/// 子 UI 管理器:不继承 MonoBehaviour,适合子场景/模块内局部面板管理
/// </summary>
public class SubUIManager
{
public UIBase subUIBaseParent;
private readonly Transform parent;
private readonly Dictionary<UIPanel, SubUIBase> panels = new Dictionary<UIPanel, SubUIBase>();
private readonly Dictionary<UIPanel, string> addressMap = new Dictionary<UIPanel, string>();
2026-02-03 11:35:19 +08:00
public T Get<T>(UIPanel type) where T : UIBase
{
return panels.TryGetValue(type, out var panel) ? panel as T : null;
}
2025-12-11 16:40:24 +08:00
public SubUIManager(Transform parent, UIPanelAddressConfig uIPanelAddressConfig)
{
this.parent = parent;
foreach (var entry in uIPanelAddressConfig.panels)
{
if (!addressMap.ContainsKey(entry.type))
addressMap.Add(entry.type, entry.address);
}
}
/// <summary>
/// 这里使用C#的异步所以操作建议在onshown中进行要不然外面的函数要加异步
/// </summary>
/// <param name="type"></param>
/// <param name="args"></param>
/// <param name="onShown"></param>
2026-02-13 19:23:01 +08:00
public async void ShowAsync(UIPanel type, object args = null)
2025-12-11 16:40:24 +08:00
{
if (addressMap.ContainsKey(type)) {
2025-12-26 11:15:56 +08:00
UIBase uIBase = await LoadAndShowAsync(type, addressMap[type], args);
2025-12-11 16:40:24 +08:00
subUIBaseParent = uIBase;
}
else
{
Debug.LogError("当前页面不存在");
}
}
2025-12-26 11:15:56 +08:00
public async Task<SubUIBase> LoadAndShowAsync(UIPanel type, string address, object args = null)
2025-12-11 16:40:24 +08:00
{
if (panels.TryGetValue(type, out var existing) && existing != null)
2025-12-13 18:18:28 +08:00
{
2025-12-26 11:15:56 +08:00
existing.Show(args);
2025-12-11 16:40:24 +08:00
return existing;
2025-12-13 18:18:28 +08:00
}
2025-12-11 16:40:24 +08:00
if (!addressMap.TryGetValue(type, out var obj) || obj == null)
{
Debug.LogError($"[SubUI] No prefab for {type}");
return null;
}
AsyncOperationHandle<GameObject> handle = Addressables.LoadAssetAsync<GameObject>(address);
await handle.Task; // 等待异步完成
if (handle.Status == AsyncOperationStatus.Succeeded)
{
var prefab = handle.Result;
var instance = Object.Instantiate(prefab, parent).GetComponent<SubUIBase>();
instance.uIManager = this;
instance.name = $"Sub_{type}_Panel";
instance.Init(type);
panels[type] = instance;
//return instance;
//var instance = GetOrCreate(type, prefab);
2025-12-26 11:15:56 +08:00
instance.Show(args);
2025-12-11 16:40:24 +08:00
return instance;
}
else
{
Debug.LogError($"Failed to load UI prefab at {address}");
return null;
}
}
public void Hide(UIPanel type)
{
if (panels.TryGetValue(type, out var panel) && panel != null)
panel.Hide();
}
2025-12-13 18:18:28 +08:00
public void Hide(SubUIBase type)
{
2025-12-11 16:40:24 +08:00
2025-12-13 18:18:28 +08:00
foreach (var panel in panels.Values)
{
if (panel== type)
{
panel.Hide();
break;
}
}
}
2025-12-11 16:40:24 +08:00
public void Close(UIPanel type)
{
if (panels.TryGetValue(type, out var panel) && panel != null)
{
panel.Hide();
Object.Destroy(panel.gameObject);
}
panels.Remove(type);
}
public void CloseAll()
{
foreach (var kv in panels)
{
if (kv.Value != null)
{
kv.Value.Hide();
Object.Destroy(kv.Value.gameObject);
}
}
panels.Clear();
}
2025-12-13 18:18:28 +08:00
//private UIBase GetOrCreate(UIPanel type,GameObject prefab)
//{
// if (panels.TryGetValue(type, out var existing) && existing != null)
// return existing;
2025-12-11 16:40:24 +08:00
2025-12-13 18:18:28 +08:00
// if (!addressMap.TryGetValue(type, out var obj) || prefab == null)
// {
// Debug.LogError($"[SubUI] No prefab for {type}");
// return null;
// }
2025-12-11 16:40:24 +08:00
2025-12-13 18:18:28 +08:00
// var instance = Object.Instantiate(prefab, parent).GetComponent<SubUIBase>();
// instance.name = $"Sub_{type}_Panel";
// instance.Init(type);
// panels[type] = instance;
// return instance;
//}
2025-12-11 16:40:24 +08:00
}