/// <summary> /// 根据在AtlasDatabase中的数据判断是否压缩过 /// </summary> /// <param name="path">atlas的prefab文件路径</param> /// <returns>若db中不存在该路径则返回false,表示没有被压缩过;若db存在该路径,则判断其isOriginal属性</returns> public static bool AtlasAlreadyShrinked(string path) { AtlasProperty ap = db.GetAtlasProperty(path); if (ap == null) { return(false); } return(!ap.isOriginal); }
/// <summary> /// 搜集项目中的atlas以及贴图资源显示在文件列表中 /// </summary> public static void CollectAtlas() { string baseDir = Application.dataPath.Substring(0, Application.dataPath.IndexOf("Assets")) + "Assets/MLDJ"; GameObject[] prefabs = BobShrinker.GetPrefabListUsingFileSys(baseDir); List <GameObject> prefabsList = new List <GameObject>(prefabs); GameObject[] atlaslist = BobShrinker.GetUIAtlasListFromPrefabList(prefabs); for (int i = 0; i < atlaslist.Length; i++) { BobUtils.DisplayProgressBar(i, atlaslist.Length, "搜集UIAtlas", atlaslist[i].name); string atlaspath = AssetDatabase.GetAssetPath(atlaslist[i]); if (!BobShrinker.db.ContainsPath(atlaspath)) { AtlasProperty originalAtlasProp = BobShrinker.GetAtlasProperty(atlaslist[i].GetComponent <UIAtlas>(), true); BobShrinker.db.SaveAtlasData(atlaspath, originalAtlasProp, originalAtlasProp); } prefabsList.Remove(atlaslist[i].gameObject); } BobUtils.ClearProgressBar(); Object[] dependencies = EditorUtility.CollectDependencies(prefabsList.ToArray()); for (int i = 0; i < dependencies.Length; i++) { if (dependencies[i] is Texture2D) { BobUtils.DisplayProgressBar(i, dependencies.Length, "搜集Textures", dependencies[i].name); string texturePath = AssetDatabase.GetAssetPath(dependencies[i]); if (!BobShrinker.db.ContainsPath(texturePath)) { TextureImporter ti = TextureImporter.GetAtPath(texturePath) as TextureImporter; if (ti == null) { Debug.LogError(texturePath); continue; } int maxTextSize = 0; TextureImporterFormat tf = new TextureImporterFormat(); bool ret = ti.GetPlatformTextureSettings("WP8", out maxTextSize, out tf);//获取WP8的平台设置 if (ret == false) { maxTextSize = ti.maxTextureSize; ti.SetPlatformTextureSettings("WP8", maxTextSize, ti.textureFormat); //若没有设置WP8平台,则用default的设置来设置 } //备份原始属性 TextureProperty originalTextureProp = new TextureProperty(maxTextSize, ti.mipmapEnabled); originalTextureProp.isOriginal = true; BobShrinker.db.SaveTextureData(texturePath, originalTextureProp, originalTextureProp); } } } BobUtils.ClearProgressBar(); }
/// <summary> /// 设置Atlas数据 /// </summary> /// <param name="path"></param> /// <param name="origin"></param> /// <param name="cur"></param> public void SaveAtlasData(string path, AtlasProperty origin, AtlasProperty cur) { int _index = mAtlasPaths.IndexOf(path); if (_index == -1) { mAtlasPaths.Add(path); mAtlasOriginalInfoList.Add(origin); mAtlasCurrentInfoList.Add(cur); } else { mAtlasOriginalInfoList[_index] = origin; mAtlasCurrentInfoList[_index] = cur; } }
/// <summary> /// 压缩UIAtlas /// </summary> /// <param name="uiatlasobj"></param> /// <returns></returns> public static ShrinkResult ShrinkAtlas(Object uiatlasobj) { AtlasProperty originalAtlasProp = null; ShrinkResult ret = prepareShrinkAtlas(uiatlasobj, ref originalAtlasProp); if (ret != ShrinkResult.Success) { return(ret); } UIAtlas uiatlas = ((GameObject)uiatlasobj).GetComponent <UIAtlas>(); BetterList <string> sl = uiatlas.GetListOfSprites(); //备份原始尺寸 originalAtlasProp = GetAtlasProperty(uiatlas, true); float times = 2f; uiatlas.scale /= times; foreach (string sn in sl) { UISpriteData sd = uiatlas.GetSprite(sn); sd.x /= (int)times; sd.y /= (int)times; sd.width /= (int)times; sd.height /= (int)times; sd.borderBottom /= (int)times; sd.borderLeft /= (int)times; sd.borderRight /= (int)times; sd.borderTop /= (int)times; sd.paddingTop /= (int)times; sd.paddingBottom /= (int)times; sd.paddingLeft /= (int)times; sd.paddingRight /= (int)times; } uiatlas.pixelSize *= times; uiatlas.MarkAsDirty(); AtlasProperty currentAtlasProp = GetAtlasProperty(uiatlas); SaveAtlasData(uiatlas, originalAtlasProp, currentAtlasProp); return(ShrinkResult.Success); }
/// <summary> /// 为压缩uiatlas做准备,包括压缩贴图及备份原始数据 /// </summary> /// <param name="uiatlasobj"></param> /// <param name="originalAtlasProp">用于存储uiatlas的原始数据</param> /// <returns></returns> private static ShrinkResult prepareShrinkAtlas(Object uiatlasobj, ref AtlasProperty originalAtlasProp) { UIAtlas uiatlas = ((GameObject)uiatlasobj).GetComponent <UIAtlas>(); string assetPath = AssetDatabase.GetAssetPath(uiatlas.gameObject); if (AtlasAlreadyShrinked(assetPath)) {//已经处理过 return(ShrinkResult.Success); } if (null == uiatlas.spriteMaterial || null == uiatlas.spriteList) { return(ShrinkResult.Failure); } BetterList <string> sl = uiatlas.GetListOfSprites(); if (sl == null) { return(ShrinkResult.Failure); } //先把纹理都缩了 Object[] dependObjs = new Object[] { uiatlas.spriteMaterial.mainTexture }; //EditorUtility.CollectDependencies(new Object[] { uiatlas.gameObject }); //获取依赖的资源 List <Texture2D> textureList = new List <Texture2D>(); for (int i = 0; i < dependObjs.Length; i++) {//搜集依赖的纹理资源 if (dependObjs[i] is Texture2D) { textureList.Add(dependObjs[i] as Texture2D); } } for (int index = 0; index < textureList.Count; ++index) { ShrinkResult sret = ShrinkTexture(textureList[index]); if (sret != ShrinkResult.Success) { RecoverUIAtlasFromMeta(uiatlasobj); return(ShrinkResult.Failure); } } return(ShrinkResult.Success); }
/// <summary> /// 获取Atlas的属性信息保存在AtlasProperty中 /// </summary> /// <param name="uiatlas"></param> /// <param name="isOriginal">指定这一属性是否是原始属性</param> /// <returns>返回的AtlasProperty中包含了uiatlas的属性</returns> public static AtlasProperty GetAtlasProperty(UIAtlas uiatlas, bool isOriginal = false) { AtlasProperty atlasProp = new AtlasProperty(); Vector4 spd, spb, spp; foreach (string sn in uiatlas.GetListOfSprites()) { UISpriteData sd = uiatlas.GetSprite(sn); spd = new Vector4(sd.x, sd.y, sd.width, sd.height); spb = new Vector4(sd.borderLeft, sd.borderRight, sd.borderBottom, sd.borderTop); spp = new Vector4(sd.paddingLeft, sd.paddingRight, sd.paddingBottom, sd.paddingTop); SpriteDetail sddd = new SpriteDetail(spd, spb, spp); atlasProp.AddSpriteDetail(sddd); } atlasProp.scale = uiatlas.scale; atlasProp.pixelSize = uiatlas.pixelSize; atlasProp.isOriginal = isOriginal; return(atlasProp); }
/// <summary> /// 显示第index个Atlas的属性 /// </summary> /// <param name="index"></param> private void ShowAtlasProperty(int index) { GUILayout.Label(BobShrinker.db.mAtlasPaths[index]); List <SpriteDetail> originalSpriteDetails = BobShrinker.db.mAtlasOriginalInfoList[index].SpriteDetails; List <SpriteDetail> currentSpriteDetails = BobShrinker.db.mAtlasCurrentInfoList[index].SpriteDetails; AtlasProperty originAtlas = BobShrinker.db.mAtlasOriginalInfoList[index]; AtlasProperty currentAtlas = BobShrinker.db.mAtlasCurrentInfoList[index]; GUILayout.Label("origin: " + originAtlas.pixelSize + " " + originAtlas.scale); GUILayout.Label("current: " + currentAtlas.pixelSize + " " + currentAtlas.scale); for (int i = 0; i < originalSpriteDetails.Count; i++) { GUILayout.Label(i.ToString() + " original Detail "); GUILayout.Label(" Demension: " + originalSpriteDetails[i].Demension.ToString()); GUILayout.Label(" Padding: " + originalSpriteDetails[i].Padding.ToString()); GUILayout.Label(" Border: " + originalSpriteDetails[i].Border.ToString()); GUILayout.Label(i.ToString() + " current Detail "); GUILayout.Label(" Demension: " + currentSpriteDetails[i].Demension.ToString()); GUILayout.Label(" Padding: " + currentSpriteDetails[i].Padding.ToString()); GUILayout.Label(" Border: " + currentSpriteDetails[i].Border.ToString()); } }
/// <summary> /// 回复UIAtlas /// </summary> /// <param name="uiatlas"></param> public static void RecoverUIAtlasFromMeta(Object uiatlasobj) { UIAtlas uiatlas = ((GameObject)uiatlasobj).GetComponent <UIAtlas>(); string assetpath = AssetDatabase.GetAssetPath(uiatlas.gameObject); if (null == uiatlas.spriteMaterial || null == uiatlas.spriteList) { return; } //先把纹理都恢复了 Object[] dependObjs = new Object[] { uiatlas.spriteMaterial.mainTexture };//获取纹理 List <Texture2D> textureList = new List <Texture2D>(); for (int i = 0; i < dependObjs.Length; i++) { if (dependObjs[i] is Texture2D) { textureList.Add(dependObjs[i] as Texture2D); } } for (int i = textureList.Count - 1; i >= 0; --i) { try { RecoverTextureFromMeta(textureList[i]); } catch (System.Exception e) { Debug.Log(e.ToString() + " " + textureList[i].name); } } if (!AtlasAlreadyShrinked(assetpath)) {//并未缩减过,则不对它进行操作 return; } AtlasProperty afterAtlasPro = db.GetAtlasProperty(AssetDatabase.GetAssetPath(uiatlas.gameObject), true); uiatlas = ((GameObject)uiatlasobj).GetComponent <UIAtlas>(); BetterList <string> sl = uiatlas.GetListOfSprites(); if (sl == null) { return; } uiatlas.scale = afterAtlasPro.scale; uiatlas.pixelSize = afterAtlasPro.pixelSize; for (int i = 0; i < afterAtlasPro.SpriteDetails.Count; i++) { UISpriteData sd = uiatlas.GetSprite(sl[i]); SpriteDetail spd = afterAtlasPro.SpriteDetails[i]; sd.x = (int)spd.Demension.x; sd.y = (int)spd.Demension.y; sd.width = (int)spd.Demension.z; sd.height = (int)spd.Demension.w; sd.borderLeft = (int)spd.Border.x; sd.borderRight = (int)spd.Border.y; sd.borderBottom = (int)spd.Border.z; sd.borderTop = (int)spd.Border.w; sd.paddingLeft = (int)spd.Padding.x; sd.paddingRight = (int)spd.Padding.y; sd.paddingBottom = (int)spd.Padding.z; sd.paddingTop = (int)spd.Padding.w; } uiatlas.MarkAsDirty(); AtlasProperty currentAtlas = GetAtlasProperty(uiatlas, true); SaveAtlasData(uiatlas, afterAtlasPro, currentAtlas); }
/// <summary> /// 保存uiatlas改变前后的信息 /// </summary> /// <param name="uiatlas"></param> /// <param name="originalAtlasProp"></param> /// <param name="currentAtlasProp"></param> private static void SaveAtlasData(UIAtlas uiatlas, AtlasProperty originalAtlasProp, AtlasProperty currentAtlasProp) { db.SaveAtlasData(AssetDatabase.GetAssetPath(uiatlas.gameObject), originalAtlasProp, currentAtlasProp); EditorUtility.SetDirty(db); }
/// <summary> /// 添加单个文件路径 /// </summary> /// <param name="filepath"></param> private void AddFileItems(string filepath) { filepath = filepath.Replace('\\', '/'); Object obj = AssetDatabase.LoadAssetAtPath(filepath, typeof(UnityEngine.Object)); if (obj == null) { return; } if (!System.IO.File.Exists(filepath) && System.IO.Directory.Exists(filepath)) {///如果是目录,则遍历其中的所有文件 string[] files = System.IO.Directory.GetFiles(filepath, "*.*", System.IO.SearchOption.AllDirectories); for (int i = 0; i < files.Length; ++i) { AddFileItems(files[i]); } return; } if (obj is Texture) { if (BobShrinker.db.mTexturePaths.Contains(filepath)) { return; } else { TextureImporter ti = TextureImporter.GetAtPath(filepath) as TextureImporter; if (ti == null) { return; } BobUtils.DisplayProgressBar(1, 1, "添加文件", filepath); int maxTextSize = 0; TextureImporterFormat tf = new TextureImporterFormat(); bool ret = ti.GetPlatformTextureSettings("WP8", out maxTextSize, out tf);//获取WP8的平台设置 if (ret == false) { maxTextSize = ti.maxTextureSize; ti.SetPlatformTextureSettings("WP8", maxTextSize, ti.textureFormat); //若没有设置WP8平台,则用default的设置来设置 } //备份原始属性 TextureProperty originalTextureProp = new TextureProperty(maxTextSize, ti.mipmapEnabled); originalTextureProp.isOriginal = true; BobShrinker.db.SaveTextureData(filepath, originalTextureProp, originalTextureProp); } } if (obj is GameObject) { GameObject go = obj as GameObject; UIAtlas uiatlas = go.GetComponent <UIAtlas>(); if (uiatlas != null) { if (BobShrinker.db.mAtlasPaths.Contains(filepath)) { return; } else if (uiatlas.spriteMaterial == null) { Debug.LogError(filepath + " has no materials"); return; } else { BobUtils.DisplayProgressBar(1, 1, "添加文件", filepath); AtlasProperty originalAtlasProp = BobShrinker.GetAtlasProperty(uiatlas, true); BobShrinker.db.SaveAtlasData(filepath, originalAtlasProp, originalAtlasProp); } } List <string> dependencies = BobUtils.CollectDependencies(filepath);//获取依赖资源 接着AddItems for (int i = 0; i < dependencies.Count; ++i) { AddFileItems(dependencies[i]); } } }