[Unity3D] 5.0 图集合并扩展工具,用于解决UGUI与AssetBundle打包造成资源包过大的问题
[Unity3D] 5.0 图集合并扩展工具,用于解决UGUI与AssetBundle打包造成资源包过大的问题
http://www.cppblog.com/shly/archive/2015/12/09/212443.html
[Unity3D] 5.0 图集合并扩展工具,用于解决UGUI与AssetBundle打包造成资源包过大的问题
UGUI Image已Sprite为主,而简单的合并图集可以使用自带的SpritePacker。
而当在使用AssetBundle的时候情况有些不同,会造成每个AB都会引入完整的Sprite图集,显然就增加了AB的大小,重复资源。
为了解决这个问题我们可以手动合并图集,那么方案也有多种,这里我们可以编辑器自带的API来实现一个小的图集合并工具。
而当在使用AssetBundle的时候情况有些不同,会造成每个AB都会引入完整的Sprite图集,显然就增加了AB的大小,重复资源。
为了解决这个问题我们可以手动合并图集,那么方案也有多种,这里我们可以编辑器自带的API来实现一个小的图集合并工具。
private static bool CombineSpritesHelper(string path, string dpath, string name, int padding)
{
string[] paths = AssetDatabase.FindAssets("t:sprite", new string[] { path });
List<Sprite> spriteList = new List<Sprite>();
List<Texture2D> texList = new List<Texture2D>();
foreach (var o in paths)
{
Sprite s = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(o), typeof(Sprite)) as Sprite;
if (null != s)
{
spriteList.Add(s);
texList.Add(s.texture);
}
}
if (texList.Count > 0)
{
Texture2D tex = new Texture2D(1024, 1024, TextureFormat.ARGB32, true);
Rect[] uvs = UITexturePacker.PackTextures(tex, texList.ToArray(), 4, 4, padding, 1024);
if (null == uvs)
{
EditorUtility.DisplayDialog(path, "图集超过1024,需要分组成多张图集", "点击退出");
Object.DestroyImmediate(tex);
tex = null;
return false;
}
else
{
List<SpriteMetaData> metaList = new List<SpriteMetaData>();
for (int i = 0; i < uvs.Length; ++i)
{
SpriteMetaData data = new SpriteMetaData();
data.alignment = (int)SpriteAlignment.Center;
data.border = spriteList[i].border;
data.name = spriteList[i].name;
data.pivot = spriteList[i].pivot;
data.rect = new Rect(uvs[i].x * tex.width, uvs[i].y * tex.height, uvs[i].width * tex.width, uvs[i].height * tex.height);
metaList.Add(data);
}
//string dpath = path.Substring(0, path.Length - obj.name.Length) + "SpriteSet";
if (!System.IO.Directory.Exists(dpath))
{
System.IO.Directory.CreateDirectory(dpath);
}
string file = dpath + "/" + name + ".png";
if (System.IO.File.Exists(file))
{
System.IO.File.Delete(file);
}
System.IO.File.WriteAllBytes(file, tex.EncodeToPNG());
AssetDatabase.ImportAsset(file, ImportAssetOptions.ForceUpdate);
Texture
{
string[] paths = AssetDatabase.FindAssets("t:sprite", new string[] { path });
List<Sprite> spriteList = new List<Sprite>();
List<Texture2D> texList = new List<Texture2D>();
foreach (var o in paths)
{
Sprite s = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(o), typeof(Sprite)) as Sprite;
if (null != s)
{
spriteList.Add(s);
texList.Add(s.texture);
}
}
if (texList.Count > 0)
{
Texture2D tex = new Texture2D(1024, 1024, TextureFormat.ARGB32, true);
Rect[] uvs = UITexturePacker.PackTextures(tex, texList.ToArray(), 4, 4, padding, 1024);
if (null == uvs)
{
EditorUtility.DisplayDialog(path, "图集超过1024,需要分组成多张图集", "点击退出");
Object.DestroyImmediate(tex);
tex = null;
return false;
}
else
{
List<SpriteMetaData> metaList = new List<SpriteMetaData>();
for (int i = 0; i < uvs.Length; ++i)
{
SpriteMetaData data = new SpriteMetaData();
data.alignment = (int)SpriteAlignment.Center;
data.border = spriteList[i].border;
data.name = spriteList[i].name;
data.pivot = spriteList[i].pivot;
data.rect = new Rect(uvs[i].x * tex.width, uvs[i].y * tex.height, uvs[i].width * tex.width, uvs[i].height * tex.height);
metaList.Add(data);
}
//string dpath = path.Substring(0, path.Length - obj.name.Length) + "SpriteSet";
if (!System.IO.Directory.Exists(dpath))
{
System.IO.Directory.CreateDirectory(dpath);
}
string file = dpath + "/" + name + ".png";
if (System.IO.File.Exists(file))
{
System.IO.File.Delete(file);
}
System.IO.File.WriteAllBytes(file, tex.EncodeToPNG());
AssetDatabase.ImportAsset(file, ImportAssetOptions.ForceUpdate);
Texture