- LocalizationManager: 新增翻译表(SetFormatted/SetDuration/LocalizeOperateMsg) - LoginPanel: InputField placeholder本地化、字体颜色保持 - HistoryPanel: 用时数据本地化、placeholder本地化 - RecordDetailPanel: 操作详情消息本地化(LanguageChanged重建) - AppraiseWindowBase: 评价等级本地化、操作消息重建 - EditorAppraiser: 所有评估消息改用InjectOperateMsgLocalized - StudentOperateRecorder: 新增InjectOperateMsgLocalized方法 - LocalizationLanguageTestBar: 单例模式、ScreenSpaceOverlay筛选 - 字体切换时保留颜色和verticalOverflow
225 lines
6.0 KiB
C#
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);
|
|
}
|
|
}
|