Files
Main/Assets/GameAssets/Resources/GameUI/Common/ItemAltasManager/UIIconAltasManager.cs

180 lines
6.1 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
//**********************************************//
//作者:#AUTHOR#
//日期:#DATE#
//简述:#DESCRIPTION#
//*********************************************//
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Thousandto.Core.Asset;
using Thousandto.Core.Base;
namespace Thousandto.Plugins.Common
{
/// <summary>
/// 类ItemAndEquipAltasManager说明
/// </summary>
public class UIIconAltasManager
{
#region //常量
private const int Segmentation = 64;
private const string AltasName = "UINewIconAtlas";
#endregion
#region //私有变量
private Dictionary<int,UIIconAltas> _altasDic; //altas 字典key为名字后面的后缀 比如public_0 这里的0;
#endregion
#region//公共接口
//初始化
public void Initialization()
{
_altasDic = new Dictionary<int , UIIconAltas>();
}
//反初始化
public void UnInitialization()
{
var enumber = _altasDic.GetEnumerator();
try
{
while ( enumber.MoveNext() )
{
if ( enumber.Current.Value.Altas != null )
{
UIPoolAssetsLoader.UnloadAtlas( enumber.Current.Value.AltasName , enumber.Current.Value.Altas.transform );
}
else
{
UIPoolAssetsLoader.UnloadAtlas( enumber.Current.Value.AltasName , null );
}
}
}
finally
{
enumber.Dispose();
}
_altasDic.Clear();
}
//获取altas
public UIIconAltas GetIconAltasWithIconId(int id, MyAction<UIAtlas> callBack)
{
UIIconAltas retAltas = null;
int index = GenerateIndexWithId(id);
_altasDic.TryGetValue(index, out retAltas);
if (null == retAltas)
{
//FLogger.LogError("UnUseAltasWithIconId:New", index);
retAltas = new UIIconAltas();
retAltas.Index = index;
retAltas.AltasName = UIPoolAssetsLoader.AtlasName(AltasName, index);
Debug.Log("yy GetIconAltasWithIconId id: " + id + " atlasName: " + retAltas.AltasName);
retAltas.RetainCount = 1;
retAltas.AddCallBack(callBack);
if (!_altasDic.ContainsKey(index))
{
_altasDic.Add(index, retAltas);
}
UIPoolAssetsLoader.LoadAtlasPrefabAsyn(AltasName, index, atlasTrans =>
{
//FLogger.LogError("GetIconAltasWithIconId ", AltasName, index, ";atlasTrans=", atlasTrans);
if (atlasTrans != null)
{
var itemAtlas = atlasTrans.GetComponent<UIAtlas>();
//FLogger.LogError("GetIconAltasWithIconId ", ";itemAtlas=", atlasTrans);
if (null != itemAtlas)
{
//FLogger.LogError("GetIconAltasWithIconId ", ";retAltas=", retAltas);
Debug.Log("yy GetIconAltasWithIconId retAltas is valid");
retAltas.Altas = itemAtlas;
retAltas.DoCallBack();
}
}
});
}
else
{
retAltas.AddCallBack(callBack);
retAltas.RetainCount++;
}
// Debug.Log(string.Format("GetIconAltasWithIconId:{0}:{1}", retAltas.AltasName, retAltas.RetainCount));
return retAltas;
}
//获取altas
public UIAtlas GetAltasWithIconId(int id, MyAction<UIAtlas> callBack)
{
UIIconAltas retAltas = GetIconAltasWithIconId(id, callBack);
return retAltas.Altas;
}
public void UnUseAltasWithIconId(int id, MyAction<UIAtlas> callBack)
{
//Debug.Log(string.Format("UnUseAltasWithIconId:{0}", id));
int index = GenerateIndexWithId( id );
UIIconAltas resAltas = null;
_altasDic.TryGetValue( index , out resAltas );
if ( null != resAltas )
{
resAltas.RemoveCallBack(callBack);
resAltas.RetainCount--;
//Debug.Log(string.Format("UnUseAltasWithIconId:{0}:{1}", resAltas.AltasName, resAltas.RetainCount));
}
}
//清除空引用的atlas
public void CleanupAltas()
{
List<UIIconAltas> removeList = new List<UIIconAltas>();
var e = _altasDic.GetEnumerator();
try
{
while (e.MoveNext())
{
if (e.Current.Value.RetainCount <= 0)
{
removeList.Add(e.Current.Value);
}
}
}
finally
{
e.Dispose();
}
for (int i = 0; i < removeList.Count; i++)
{
var resAltas = removeList[i];
if (resAltas.Altas != null)
{
UIPoolAssetsLoader.UnloadAtlas(resAltas.AltasName, resAltas.Altas.transform);
}
else
{
UIPoolAssetsLoader.UnloadAtlas(resAltas.AltasName, null);
}
_altasDic.Remove(resAltas.Index);
}
removeList.Clear();
}
#endregion
#region //私有函数
/// <summary>
/// 通过icon的索引值来计算atlas的索引
/// icon的索引值时从1开始
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
private int GenerateIndexWithId( int id )
{
int index = (id -1) / Segmentation + 1;
return index;
}
#endregion
}
}