unityzgy/Assets/Scripts/ZFramwork/UIFramwork/UIManager.cs
ayuan9957 bf12e02276 feat: 多语言本地化系统 - 支持中/英/法/俄实时切换
- LocalizationManager: 新增翻译表(SetFormatted/SetDuration/LocalizeOperateMsg)
- LoginPanel: InputField placeholder本地化、字体颜色保持
- HistoryPanel: 用时数据本地化、placeholder本地化
- RecordDetailPanel: 操作详情消息本地化(LanguageChanged重建)
- AppraiseWindowBase: 评价等级本地化、操作消息重建
- EditorAppraiser: 所有评估消息改用InjectOperateMsgLocalized
- StudentOperateRecorder: 新增InjectOperateMsgLocalized方法
- LocalizationLanguageTestBar: 单例模式、ScreenSpaceOverlay筛选
- 字体切换时保留颜色和verticalOverflow
2026-07-16 10:05:59 +08:00

225 lines
6.0 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
using XFramework;
public class UIManager
{
/// <summary>
/// 存储所有的UI以及UI对应的GameObject
/// key为路径
/// </summary>
private Dictionary<string, GameObject> dictUI;
/// <summary>
/// 存储所有的UI以及UI对应的BasePanel
/// key为路径
/// </summary>
private Dictionary<string, BasePanel> dictPanel;
/// <summary>
/// 管理UI的栈
/// </summary>
private Stack<BasePanel> panelStack;
/// <summary>
/// 画布的名称
/// </summary>
private string canvasName;
/// <summary>
/// 画布对象
/// </summary>
private GameObject canvasObj;
/// <summary>
/// 面板管理器
/// </summary>
/// <param name="name">画布名称</param>
public UIManager(string name = "Canvas")
{
dictUI = new Dictionary<string, GameObject>();
dictPanel = new Dictionary<string, BasePanel>();
panelStack = new Stack<BasePanel>();
canvasName = name;
canvasObj = GameObject.Find(canvasName);
}
/// <summary>
/// 初始化画布缩放设置
/// </summary>
/// <param name="adaptScreenSize"></param>
public void InitCanvasScaler(CanvasScaler.ScaleMode scaleMode, Vector2 adaptScreenSize,float matchWOH)
{
if (canvasObj)
{
CanvasScaler canvasScaler = canvasObj.GetComponent<CanvasScaler>();
canvasScaler.uiScaleMode = scaleMode;
canvasScaler.referenceResolution = adaptScreenSize;
canvasScaler.matchWidthOrHeight = matchWOH;
}
}
/// <summary>
/// 获取一个UI对象
/// </summary>
/// <param name="ui">UI类型</param>
/// <returns></returns>
private GameObject GetSingleUI(UIType ui)
{
if (dictUI.ContainsKey(ui.Name))
{
ui.Init = true;
return dictUI[ui.Name];
}
if (canvasObj == null)
{
canvasObj = GameObject.Find(canvasName);
if (canvasObj == null)
{
Debug.LogError($"名为{canvasName}的画布不存在");
return null;
}
}
GameObject obj = GameObject.Instantiate<GameObject>(Resources.Load<GameObject>(ui.Path), canvasObj.transform);
obj.name = ui.Name;
dictUI.Add(ui.Name, obj);
LocalizationManager.Ensure();
// Defer until panel initialization has assigned dynamic display values.
obj.AddComponent<LocalizationRefreshOnEnable>();
return obj;
}
/// <summary>
/// 移除UI
/// </summary>
/// <param name="ui"></param>
/// <param name="isDestroy">是否销毁,不销毁即隐藏</param>
public void DestroyUI(UIType ui, bool isDestroy = false)
{
if (dictUI.ContainsKey(ui.Name))
{
if (isDestroy)
{
GameObject.Destroy(dictUI[ui.Name]);
dictUI.Remove(ui.Name);
dictPanel.Remove(ui.Name);
}
else
{
dictUI[ui.Name].transform.PanelAppearance(false);
}
}
}
/// <summary>
/// 加入一个新面板
/// </summary>
/// <param name="newPanel"></param>
public BasePanel Push(BasePanel newPanel)
{
if (panelStack.Count > 0)
panelStack.Peek().OnDisable();//显示新面板时屏蔽下层面板
if (!dictPanel.ContainsKey(newPanel.UI.Name))
{
dictPanel.Add(newPanel.UI.Name, newPanel);
GameObject obj = GetSingleUI(newPanel.UI);
newPanel.ActivePanel = obj.transform;
newPanel.Initializa(this);
}
else
{
BasePanel p = dictPanel[newPanel.UI.Name];
newPanel = p;
}
newPanel.OnStart();
if (panelStack.Count > 0)
{
//防止连续推送重复的面板
if (panelStack.Peek().UI.Name != newPanel.UI.Name)
panelStack.Push(newPanel);
}
else
panelStack.Push(newPanel);
return newPanel;
}
/// <summary>
/// 移除最上层面板
/// </summary>
public void Pop()
{
if (panelStack.Count > 0)
panelStack.Pop().OnDestroy();
if (panelStack.Count > 0)
panelStack.Peek().OnEnable();
}
/// <summary>
/// 移除所有面板 场景跳转或所有UI需要重新加载时调用
/// </summary>
public void PopAll()
{
var values = dictPanel.Values.ToList();
while (values.Count > 0)
{
values[0].OnDestroy(true);
values.RemoveAt(0);
}
}
/// <summary>
/// 获取当前显示的面板
/// </summary>
public BasePanel GetActivePanel()
{
if (panelStack.Count == 0) return null;
return panelStack.Peek();
}
/// <summary>
/// 更新当前显示的面板
/// </summary>
public void ChangePanel(object data)
{
if (panelStack.Count == 0) return;
panelStack.Peek().Change(data);
}
/// <summary>
/// 更新当前显示的面板
/// </summary>
public void ChangePanel( float data)
{
if (panelStack.Count == 0) return;
panelStack.Peek().Change(data);
}
/// <summary>
/// 更新当前显示的面板
/// </summary>
public void ChangePanel(string msgType,object value)
{
if (panelStack.Count == 0) return;
panelStack.Peek().Change(msgType,value);
}
//在当前UI上显示提示文字
public void ShowPromptText(string promprMsg,Color textColor)
{
if (panelStack.Count == 0) return;
panelStack.Peek().ShowPromoptText(promprMsg, textColor,Vector2.zero);
}
/// <summary>
/// 更新指定面板面板
/// </summary>
public void ChangeOnePanel(string panelName,object data)
{
if (!dictPanel.ContainsKey(panelName))
return;
dictPanel[panelName].Change(data);
}
}