97 lines
2.3 KiB
C#
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
|
|
}
|
|
}
|
|
} |