using UnityEngine; using UnityEditor; using System.Collections.Generic; namespace BF { public class Atlas : ScriptableObject, ISerializationCallbackReceiver { [SerializeField] List spriteList = new List(); [SerializeField] [HideInInspector] List spriteNameList = new List(); Dictionary spriteDict = new Dictionary(); #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 bool GetIsHashCollision() { return spriteNameList.Count != spriteDict.Count; } 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.TryAdd(spriteNameList[i], spriteList[i]); } #if !UNITY_EDITOR spriteNameList.Clear(); spriteList.Clear(); #endif } } }