using System; using System.Collections.Generic; using UnityEngine; namespace HotUpdate.UI { /// /// 竖屏 UI 页面栈:加载 Prefab、打开/关闭、按名查找。 /// public sealed class UiManager : MonoBehaviour { public static UiManager Instance { get; private set; } readonly Dictionary _opened = new Dictionary(StringComparer.Ordinal); Transform _root; UiPrefabLoader _loader; public void Init(Transform root, UiPrefabLoader loader) { Instance = this; _root = root; _loader = loader ?? new UiPrefabLoader(); } public GameObject Open(string prefabName, int siblingIndex = -1) { if (string.IsNullOrEmpty(prefabName)) return null; if (_opened.TryGetValue(prefabName, out var existing) && existing != null) { existing.SetActive(true); return existing; } var prefab = _loader.Load(prefabName); if (prefab == null) { Debug.LogError($"[UiManager] prefab not found: {prefabName}"); return null; } var go = Instantiate(prefab, _root, false); go.name = prefabName; if (siblingIndex >= 0) go.transform.SetSiblingIndex(siblingIndex); _opened[prefabName] = go; return go; } public T Open(string prefabName) where T : Component { var go = Open(prefabName); return go != null ? go.GetComponentInChildren(true) : null; } public void Close(string prefabName, bool destroy = false) { if (!_opened.TryGetValue(prefabName, out var go) || go == null) return; if (destroy) { Destroy(go); _opened.Remove(prefabName); } else go.SetActive(false); } public GameObject Get(string prefabName) { _opened.TryGetValue(prefabName, out var go); return go; } void OnDestroy() { if (Instance == this) Instance = null; } } }