using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using Object = UnityEngine.Object; public class SpriteManager { private Dictionary<string, Dictionary<string, Sprite>> _atlasDic; private AssetBundleManifest _manifest; private static SpriteManager _instance; public static SpriteManager Instance { get { if (_instance == null) { _instance = new SpriteManager(); } return _instance; } } private SpriteManager() { _atlasDic = new Dictionary<string, Dictionary<string, Sprite>>(); AssetBundle assetBundle = AssetBundle.LoadFromFile(ClientInfo.DataPath + "/AssetBundleDatas/Sprite/Sprite"); _manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); Debug.Log("初始化图片资源管理器"); } /// <summary> /// 从Resources文件夹下读取资源 /// </summary> /// <param name="path"></param> /// <returns></returns> public Sprite LoadResource(string path) { if (string.IsNullOrEmpty(path)) return null; if (!_atlasDic.ContainsKey(path)) { Sprite[] res = Resources.LoadAll<Sprite>(path); if (res == null) return null; Dictionary<string, Sprite> sp = new Dictionary<string, Sprite>(); for (int i = 0; i < res.Length; i++) { Sprite s = res[i]; sp[s.name] = s; } _atlasDic.Add(path, sp); } else { //return _spritedic[path]; } return null; } /// <summary> /// /// </summary> /// <param name="value">图集名/图片名</param> /// <returns></returns> public Sprite LoadSprite(string value, bool isAtlas = true) { if (string.IsNullOrEmpty(value)) return null; string[] array = value.Split('/'); if (array.Length != 2) return null; if(isAtlas) return LoadAtlas(array[0], array[1]); else return LoadFormUI(array[0], array[1]); } /// <summary> /// AssetBundle查找Sprite /// </summary> /// <param name="atlasName"></param> /// <param name="spriteName"></param> /// <returns></returns> public Sprite LoadAtlas(string atlasName,string spriteName) { if (string.IsNullOrEmpty(atlasName) || string.IsNullOrEmpty(spriteName)) return null; atlasName = atlasName.ToLower(); spriteName = spriteName.ToLower(); if (_atlasDic.ContainsKey(atlasName)) { Dictionary<string, Sprite> spriteDict = _atlasDic[atlasName]; if (spriteDict != null && spriteDict.ContainsKey(spriteName)) { return spriteDict[spriteName]; } } else { string url = string.Format("{0}/AssetBundleDatas/Sprite/{1}.data", ClientInfo.DataPath, atlasName); if(!File.Exists(url)) { Debug.LogError(atlasName + " 图集不存在"); return null; } AssetBundle ab = AssetBundle.LoadFromFile(url); if (ab == null) { Debug.LogError("注意:图集不存在" + atlasName); return null; } Sprite[] objs = ab.LoadAllAssets<Sprite>(); //ab.Unload(false); GlobalWindowManager.instance.StartCoroutine(UnloadAssetBundle(ab)); if (objs == null) { Debug.LogError("注意:图不存在" + atlasName); return null; } Dictionary<string, Sprite> atlas = new Dictionary<string, Sprite>(); for (int i = 0; i < objs.Length; i++) { Sprite s = objs[i]; string name = s.name.ToLower(); atlas[name] = s; } _atlasDic.Add(atlasName, atlas); if (atlas.ContainsKey(spriteName)) return atlas[spriteName]; } Debug.LogError("注意:" + atlasName + " 图集中不存在" + spriteName); return null; } IEnumerator UnloadAssetBundle(AssetBundle ab) { yield return null; ab.Unload(false); } private List<string> AsyncAssets = new List<string>(); /// <summary> /// AssetBundle查找Sprite异步 /// </summary> /// <param name="atlasName"></param> /// <param name="spriteName"></param> /// <returns></returns> public void LoadAtlas(string atlasName,string spriteName, Action<Sprite> back) { if (string.IsNullOrEmpty(atlasName) || string.IsNullOrEmpty(spriteName)) return; atlasName = atlasName.ToLower(); spriteName = spriteName.ToLower(); AssetBundleTool.instance.StartCoroutine(LoadSprite(atlasName, spriteName, back)); } private IEnumerator LoadSprite(string atlasName,string spriteName, Action<Sprite> back) { while (AsyncAssets.Contains(atlasName)) { yield return 1; } if (_atlasDic.ContainsKey(atlasName)) { Dictionary<string, Sprite> spriteDict = _atlasDic[atlasName]; if (spriteDict != null && spriteDict.ContainsKey(spriteName)) { back?.Invoke(spriteDict[spriteName]); } } else { string url = string.Format("{0}/AssetBundleDatas/Sprite/{1}.data", ClientInfo.DataPath, atlasName); if(!File.Exists(url)) { Debug.LogError(atlasName + " 图集不存在"); yield break; } AssetBundle ab = AssetBundle.LoadFromFile(url); if (ab == null) { Debug.LogError("注意:图集不存在" + atlasName); yield break; } AsyncAssets.Add(atlasName); AssetBundleRequest request = ab.LoadAllAssetsAsync<Sprite>(); yield return request; Object[] objs = request.allAssets; ab.Unload(false); AsyncAssets.Remove(atlasName); if (objs == null) { Debug.LogError("注意:图不存在" + atlasName); yield break; } Dictionary<string, Sprite> atlas = new Dictionary<string, Sprite>(); for (int i = 0; i < objs.Length; i++) { Sprite s = objs[i] as Sprite; if (s != null) { string name = s.name.ToLower(); atlas[name] = s; } } _atlasDic.Add(atlasName, atlas); if (atlas.ContainsKey(spriteName)) back?.Invoke(atlas[spriteName]); } } public Sprite LoadFormUI(string assetBundleName, string spriteName) { assetBundleName = assetBundleName.ToLower(); spriteName = spriteName.ToLower(); string atlasName = string.Format("UI/{0}", assetBundleName); if (_atlasDic.ContainsKey(atlasName)) { Dictionary<string, Sprite> spriteDict = _atlasDic[atlasName]; if (spriteDict != null && spriteDict.ContainsKey(spriteName)) { return spriteDict[spriteName]; } } string resUrl = string.Format("{0}/AssetBundleDatas/UI/{1}.data", ClientInfo.DataPath, assetBundleName); object[] objs = AssetBundleTool.instance.GetAssets(resUrl); if (objs == null) return null; Sprite[] sprites = AssetTool.GetAssetAll<Sprite>((Object[]) objs); for (int i = 0; i < sprites.Length; i++) { Sprite sprite = sprites[i]; if (string.Equals(sprite.name.ToLower(), spriteName)) { Dictionary<string, Sprite> atlas; if (_atlasDic.ContainsKey(atlasName)) atlas = _atlasDic[atlasName]; else { atlas = new Dictionary<string, Sprite>(); _atlasDic.Add(atlasName, atlas); } string name = sprite.name.ToLower(); atlas[name] = sprite; return sprite; } } return null; } }
SpriteManager 加载图集
最新推荐文章于 2021-11-10 20:08:34 发布