发布出来的APK部分Label上的字被压扁
项目使用Unity4.7.1配合NGUI3.5.5开发,发布出来的APK,发现部分Label上的字压扁了,两个字会出现重叠的情况,对比之后发现,被压扁的字Label的一个属性设为Bold,修改为Normal之后正常显示。
还有另外一种方法就是使用BBCode,在文字的前面加[b],精测试,可以正常显示,并不会拉伸。
项目中的预设那么多,不可能手动改的,自己写了一些编辑器类,由编辑器帮我们把这个事情做了。下面贴代码:
1 using UnityEngine; 2 using UnityEditor; 3 using System.IO; 4 5 public class PrefabWordProcessing 6 { 7 [MenuItem("Game/将预设中所有UILabel上的fontStyle设为Normal状态")] 8 public static void ProcessingPrefabLabel() 9 { 10 string filePath = Application.dataPath + "/GameRes"; 11 if (!Directory.Exists(filePath)) 12 { 13 Debug.LogError("文件路径不存在,请检查。"); 14 return; 15 } 16 string[] files = Directory.GetFiles(filePath, "*.prefab", SearchOption.AllDirectories); 17 if (files.Length == 0) 18 { 19 Debug.LogError("文件夹中不存在prefab文件,请检查。"); 20 } 21 22 for (int i = 0, imax = files.Length; i < imax; i++) 23 { 24 string path = files[i].Replace("\\", "/"); 25 path = path.Substring(path.IndexOf("Assets")); 26 Object tempObject = Resources.LoadAssetAtPath<Object>(path); 27 if (tempObject != null) 28 { 29 GameObject go = GameObject.Instantiate(tempObject) as GameObject; 30 UILabel[] labels = go.GetComponentsInChildren<UILabel>(); 31 if (labels.Length == 0) 32 { 33 GameObject.DestroyImmediate(go); 34 Resources.UnloadUnusedAssets(); 35 continue; 36 } 37 else 38 { 39 //取得资源打包的标签 40 string[] tempObjectLabels = AssetDatabase.GetLabels(tempObject); 41 42 for (int j = 0, jmax = labels.Length; j < jmax; j++) 43 { 44 if (labels[j].fontStyle == FontStyle.Bold) 45 { 46 labels[j].fontStyle = FontStyle.Normal; 47 } 48 } 49 Debug.Log("保存预设成功,名字为:" + go.name); 50 PrefabUtility.CreatePrefab(path, go, ReplacePrefabOptions.ReplaceNameBased); 51 GameObject.DestroyImmediate(go); 52 53 //把资源的标签重新设置回去 54 tempObject = Resources.LoadAssetAtPath<Object>(path); 55 AssetDatabase.SetLabels(tempObject, tempObjectLabels); 56 Resources.UnloadUnusedAssets(); 57 } 58 } 59 } 60 AssetDatabase.Refresh(); 61 } 62 }
使用这个代码时会出现错误信息m_InstanceID == 0,然后FQ找了一下资料,有篇文章说是Unity的Bug,在循环调用PrefabUtility.CreatePrefab方法会出现,大概150次出现一个。原本4.6.9已经修复该Bug,但是4.7之后又出现了。下面是原文地址:
http://forum.unity3d.com/threads/unity-4-7-m_instanceid-0-when-calling-prefabutility-createprefab.382615/