Files
JJBB/Assets/Project/Script/GUI/Board/DamageBoardManager.cs
2024-08-23 15:49:34 +08:00

152 lines
4.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using GCGame.Table;
using UnityEngine;
// 注保持这个类型作为数据接口实际表现在WorldUiRoot中处理
public class DamageBoardManager : MonoBehaviour
{
public static DamageBoardManager damageBoardManager;
private readonly Dictionary<string, UIImgFont> _imgFonts = new Dictionary<string, UIImgFont>();
private readonly List<MyTuple<int, int>> _maxNumberList = new List<MyTuple<int, int>>();
private readonly Dictionary<int, string> _typeToFont = new Dictionary<int, string>();
private readonly Dictionary<int, int> m_TypeShowIndex = new Dictionary<int, int>();
private bool _init;
private void Awake()
{
damageBoardManager = this;
}
public static void PreloadDamageBoard()
{
if (damageBoardManager != null)
damageBoardManager.PreloadDamageBoardIns();
}
public UIImgFont GetImgFont(int type)
{
UIImgFont result = null;
string fontName;
if (_typeToFont.TryGetValue(type, out fontName))
_imgFonts.TryGetValue(fontName, out result);
return result;
}
public void AddFont(string assetName, Object resObj, Hashtable table)
{
var newObj = resObj as GameObject;
if (newObj != null)
{
var font = newObj.GetComponent<UIImgFont>();
if (font != null)
_imgFonts[assetName] = font;
}
}
private void LoadFont()
{
if (!_init)
{
_init = true;
var fontList = new HashSet<string>();
foreach (var damageTab in TableManager.GetDamageBoardType().Values)
{
var fontName = damageTab.FontName;
if (fontName.Length > 2)
{
_typeToFont.Add(damageTab.GetId(), fontName);
fontList.Add(fontName);
}
}
foreach (var fontName in fontList)
LoadAssetBundle.Instance.LoadGameObject(LoadAssetBundle.BUNDLE_PATH_Other,
fontName, AddFont, null, true);
}
}
//预加载一些伤害板
public void PreloadDamageBoardIns()
{
LoadFont();
}
public string GetTypeShowIndex(int nType, Tab_DamageBoardType tabDamageBoardType)
{
var motionName = string.Empty;
if (tabDamageBoardType != null)
{
int typeIndex;
var motionCount = tabDamageBoardType.getMotionNameCount();
if (!m_TypeShowIndex.TryGetValue(nType, out typeIndex))
typeIndex = 0;
// 维持原来的自修复逻辑 - typeIndex获取动画失败就自动试图拿下一个类型的动画
for (var i = 0; i < motionCount; i++)
{
var motionIndex = i + typeIndex;
if (motionIndex > motionCount - 1)
motionIndex -= motionCount;
motionName = tabDamageBoardType.GetMotionNamebyIndex(motionIndex);
if (!string.IsNullOrEmpty(motionName))
{
typeIndex = motionIndex;
break;
}
}
m_TypeShowIndex[nType] = typeIndex + 1;
}
return motionName;
}
/// <summary>
/// 获得DamageBoard的表格数据仅在所有检查成功才会返回
/// </summary>
public Tab_DamageBoardType TryAddDamageBoard(int nType)
{
if (damageBoardManager == null)
{
return null;
}
Tab_DamageBoardType damageBoardList;
Tab_DamageBoardType result;
var dictionary = TableManager.GetDamageBoardType();
result = dictionary.TryGetValue(nType, out damageBoardList) ? damageBoardList : dictionary[0];
var record = _maxNumberList.Find(a => a.first == nType);
if (record == null)
{
record = new MyTuple<int, int>(nType, 0);
_maxNumberList.Add(record);
}
if (record.second >= result.MaxNum)
result = null;
else
record.second++;
return result;
}
/// <summary>
/// 移除伤害面板最大数目
/// </summary>
public void RemoveDamageBoard(int nType)
{
var record = _maxNumberList.Find(a => a.first == nType);
if (record != null)
record.second = Mathf.Max(0, record.second - 1);
}
/// <summary>
/// 清除全部面板数量统计的记录
/// </summary>
public void ClearNumber()
{
for (var i = 0; i < _maxNumberList.Count; i++)
_maxNumberList[i].second = 0;
}
}