发布出来的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/

posted @ 2016-06-15 11:50  MrHakim  阅读(344)  评论(0编辑  收藏  举报