因为NGUI内部已经封装了方法,获取图集比较容易,但是UGUI需要自己来封装,所以动态设置图集的时候就比较麻烦,所以简单写了一个方法,这里记录一下以后直接拿来用就可以了:
// 记录图集 private static Dictionary<string, Sprite[]> recordAtlasDic = new Dictionary<string, Sprite[]>(); // 记录sprite private static Dictionary<string, Sprite> spriteDic = new Dictionary<string, Sprite>(); public static Sprite LoadSprites(string atlasName, string spriteName) { Sprite spriteOntology = null; spriteDic.TryGetValue(spriteName, out spriteOntology); if (spriteOntology == null) { Sprite[] atlasArry = null; recordAtlasDic.TryGetValue(atlasName, out atlasArry); if (atlasArry != null) { atlasArry = recordAtlasDic[atlasName]; } else { try { atlasArry = Resources.LoadAll(atlasName); recordAtlasDic.Add(atlasName, atlasArry); } catch { throw new Exception(string.Format("Resources.Load{0}fail!", atlasName)); } } try { for (int i = 0; i < atlasArry.Length; i++) { string key = atlasArry[i].name; spriteDic.Add(key, atlasArry[i]); } spriteOntology = spriteDic[spriteName]; } catch { throw new Exception(string.Format("No atlas was found:{0}", atlasName)); } } return spriteOntology; }
使用的时候传入图集所在的Resources路径,传入要获取的sprite名字就OK了。当然你也可以换成加载AB包的方式这里就不再赘述了。
说明:今天在网上看到一篇给Image动态赋值sprite文章,实现思路大致和上面的方法相同,不同之处在于作者用了一个字典来缓存精灵图Dictionary<string, Sprite[]>,使用的时候获取Value来遍历查找精灵图,于是顺便测试了这两种方法的性能。结论是上面这种方法优于网上看到的方法,以下是测试截图(图一是我的这种方式,图二是他的方法):




退出登录?