2023-04-03 11:04:31 +08:00

97 lines
2.3 KiB
C#

using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
namespace BF
{
public class Atlas : ScriptableObject, ISerializationCallbackReceiver
{
[SerializeField]
List<Sprite> spriteList = new List<Sprite>();
[SerializeField]
[HideInInspector]
List<uint> spriteNameList = new List<uint>();
Dictionary<uint, Sprite> spriteDict = new Dictionary<uint, Sprite>();
#if UNITY_EDITOR
public bool AddSprite(Sprite sprite)
{
if (sprite == null)
{
return false;
}
spriteList.Add(sprite);
spriteNameList.Add(Utils.BKDRHash(sprite.name));
return true;
}
public void RemoveSprite(Sprite sprite)
{
if (sprite == null)
{
return;
}
spriteList.Remove(sprite);
spriteNameList.Remove(Utils.BKDRHash(sprite.name));
}
public void RemoveNullSprite()
{
EnsureWithoutNull();
}
public bool Contains(Sprite sprite)
{
return spriteList.Contains(sprite);
}
public void Clear()
{
spriteList.Clear();
spriteNameList.Clear();
}
public int GetCount()
{
return spriteList.Count;
}
void EnsureWithoutNull()
{
int count = spriteList.Count;
for (int i = count - 1; i >= 0; i--)
{
if (spriteList[i] == null)
{
spriteList.RemoveAt(i);
spriteNameList.RemoveAt(i);
}
}
}
#endif
public Sprite GetSprite(uint spriteName)
{
Sprite result;
spriteDict.TryGetValue(spriteName, out result);
return result;
}
public void OnBeforeSerialize() { }
public void OnAfterDeserialize()
{
spriteDict.Clear();
int count = spriteNameList.Count;
for (int i = 0; i < count; i++)
{
spriteDict.Add(spriteNameList[i], spriteList[i]);
}
#if !UNITY_EDITOR
spriteNameList.Clear();
spriteList.Clear();
#endif
}
}
}