Files
Main/Assets/GameAssets/Resources/GameUI/Common/ItemAltasManager/UIIconAltasManager.cs
2025-01-25 04:38:09 +08:00

180 lines
6.1 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.

//**********************************************//
//作者:#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
}
}