因为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来遍历查找精灵图,于是顺便测试了这两种方法的性能。结论是上面这种方法优于网上看到的方法,以下是测试截图(图一是我的这种方式,图二是他的方法):

图一
图二
图一
图二