青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

l

成都手游碼農(nóng)一枚
隨筆 - 32, 文章 - 0, 評(píng)論 - 117, 引用 - 0
數(shù)據(jù)加載中……

[Unity3D] RichText 圖標(biāo)擴(kuò)展的簡(jiǎn)單實(shí)現(xiàn)

方法一:
利用 Horizontal Layout & Vertical Layout 布局。
大概Lyaout控件結(jié)構(gòu):
----V
----H
----Text|Icon|Text|Icon
----H
----Text|Icon|Text|Icon
----H
----Text|Icon|Text|Icon
----H
----Text|Icon|Text|Icon
方法簡(jiǎn)答,缺點(diǎn)換行不易處理(需要拆分字符串獲取長(zhǎng)度換行),且性能較差。
  1 public class BattleLogManager : MonoBehaviour 
  2 {
  3 
  4     public static BattleLogManager Instance;
  5 
  6     public GameObject mContent;
  7     // 行預(yù)制體
  8     public GameObject[] mItemPrefabs;
  9     public UISpriteSet mSpriteSet;
 10     public Font mFont;
 11     public int mFontSize = 35;
 12 
 13     private float mLineWidth = 600;
 14 
 15     void Start()
 16     {
 17         
 18         mLineWidth = ((mContent.transform as RectTransform).rect.width);
 19     }
 20 
 21     void OnDestroy()
 22     {
 23         Instance = null;
 24     }
 25 
 26     void OnEnable()
 27     {
 28         Instance = this;
 29     }
 30 
 31     // 特別注意:Text本身的RichText標(biāo)簽要過濾掉才能計(jì)算字符串寬度從而判斷是不是需要換行
 32     int AppendText(GameObject go, string str, float offset, out float width, out string richToken)
 33     {
 34         var objTr = new GameObject("item").transform;
 35 
 36         CharacterInfo ci;
 37         var i = 0;
 38 
 39         richToken = "";
 40         width = 0.0f;
 41         for (; i < str.Length; ++i)
 42         {
 43             var ch = str[i];
 44 
 45             if (ch == '<' && i < str.Length - 1 && str[i + 1] != '/')
 46             {
 47                 var j = i + 1;
 48                 for (; j < str.Length; ++j)
 49                 {
 50                     if (str[j] == '>')
 51                     {
 52                         break;
 53                     }
 54                 }
 55 
 56                 if (j < str.Length)
 57                 {
 58                     richToken = str.Substring(i, j - i + 1);
 59                     i = j + 1;
 60                 }
 61             }
 62 
 63             if (ch == '<' && i < str.Length - 7 && str[i + 1] == '/')
 64             {
 65                 richToken = "";
 66                 i += 8;
 67             }
 68 
 69             if (i >= str.Length)
 70             {
 71                 if (string.IsNullOrEmpty(richToken))
 72                 {
 73                     Global.Log("bad rich format!");
 74                 }
 75                 break;
 76             }
 77 
 78             ch = str[i];
 79 
 80             mFont.GetCharacterInfo(str[i], out ci);
 81             var advance = ci.advance * (mFontSize / 32.0f);
 82             if (width + advance + offset > mLineWidth)
 83             {
 84                 break;
 85             }
 86             width += advance;
 87         }
 88 
 89         var newStr = (i == str.Length ? str : str.Substring(0, i)) + (string.IsNullOrEmpty(richToken) ? "" : "</color>");
 90 
 91         objTr.SetParent(go.transform);
 92         objTr.localPosition = Vector3.zero;
 93         objTr.localScale = Vector3.one;
 94         objTr.localRotation = Quaternion.identity;
 95 
 96         var text = objTr.gameObject.AddComponent<UnityEngine.UI.Text>();
 97 
 98         text.font = mFont;
 99         text.fontSize = mFontSize;
100         text.alignment = TextAnchor.MiddleCenter;
101         text.text = newStr;
102         text.horizontalOverflow = HorizontalWrapMode.Overflow;
103 
104         return i;
105     }
106 
107     bool AppendIcon(GameObject go, string icon, float offset, out float width)
108     {
109         Material material;
110         var sprite = mSpriteSet.Get(icon, out material);
111 
112         width = 0;
113         if (!sprite)
114         {
115             return true;
116         }
117 
118         width = sprite.rect.width;
119 
120         if (offset + width > mLineWidth)
121         {
122             return false;
123         }
124         else
125         {
126             var objTr = new GameObject("item").transform;
127 
128             objTr.parent = go.transform;
129             objTr.localPosition = Vector3.zero;
130             objTr.localScale = Vector3.one;
131             objTr.localRotation = Quaternion.identity;
132 
133             var image = objTr.gameObject.AddComponent<UnityEngine.UI.Image>();
134 
135             image.sprite = sprite;
136             image.material = material;
137             image.SetNativeSize();
138         }
139 
140         return true;
141     }
142 
143     void InnerInsertBattleLog(int itemPrefabIndex, string str, int alignment, float offset)
144     {
145         var itemObjectTr = Instantiate(mItemPrefabs[itemPrefabIndex]).transform;
146 
147         itemObjectTr.SetParent(mContent.transform);
148         itemObjectTr.localPosition = Vector3.zero;
149         itemObjectTr.localScale = Vector3.one;
150         itemObjectTr.localRotation = Quaternion.identity;
151         itemObjectTr.GetComponent<UnityEngine.UI.HorizontalLayoutGroup>().childAlignment = (TextAnchor)alignment;
152 
153         var textStart = 0;
154 
155         for (var i = 0; i < str.Length; )
156         {
157             if (i < str.Length - 1 && str[i] == '$' && str[i + 1] == '<')
158             {
159                 var iconStart = i + 2;
160                 var iconEnd = -1;
161 
162                 for (var j = iconStart; j < str.Length; ++j)
163                 {
164                     if (str[j] == '>')
165                     {
166                         iconEnd = j;
167                         break;
168                     }
169                 }
170 
171                 if (iconEnd != -1)
172                 {
173                     if (textStart != iconStart - 2)
174                     {
175                         var width = 0.0f;
176                         string richToken = null;
177                         var subEndIndex = AppendText(itemObjectTr.gameObject, str.Substring(textStart, iconStart - 2 - textStart), offset, out width, out richToken);
178 
179                         offset += width;
180                         if (subEndIndex < iconStart - 2 - textStart)
181                         {
182                             InnerInsertBattleLog(itemPrefabIndex, richToken + str.Substring(textStart + subEndIndex, str.Length - (textStart + subEndIndex)), alignment, 0);
183                             return;
184                         }
185                     }
186 
187                     // new line
188                     {
189                         var width = 0.0f;
190 
191                         if (!AppendIcon(itemObjectTr.gameObject, str.Substring(iconStart, iconEnd - iconStart), offset, out width))
192                         {
193                             InnerInsertBattleLog(itemPrefabIndex, str.Substring(iconStart - 2, str.Length - (iconStart - 2)), alignment, 0);
194                             return;
195                         }
196                         offset += width;
197                     }
198 
199                     i = iconEnd + 1;
200                     textStart = i;
201                 }
202                 else
203                 {
204                     ++i;
205                 }
206             }
207             else
208             {
209                 ++i;
210             }
211         }
212 
213         if (textStart < str.Length)
214         {
215             var width = 0.0f;
216             string richToken = null;
217             var subEndIndex = AppendText(itemObjectTr.gameObject, str.Substring(textStart, str.Length - textStart), offset, out width, out richToken);
218 
219             offset += width;
220             if (subEndIndex < str.Length - textStart)
221             {
222                 InnerInsertBattleLog(itemPrefabIndex, richToken + str.Substring(textStart + subEndIndex, str.Length - textStart - subEndIndex), alignment, 0);
223                 return;
224             }
225         }
226     }
227 
228     public void InsertBattleLog(int itemPrefabIndex, string str, int alignment)
229     {
230         InnerInsertBattleLog(itemPrefabIndex, str, alignment, 0);
231     }
232 
233     public void ClearAllLog()
234     {
235         for (var i = mContent.transform.childCount - 1; i >= 0; --i)
236         {
237             Destroy(mContent.transform.GetChild(i).gameObject);
238         }
239     }
240 }
241 

方法二:
1.利用FontCreator查找多余可利用字符編碼。
例如:E7CC-E7D6



2.合成ICON圖集,只支持一張,注意:貼圖尋址模式必須是 Repeat ,因?yàn)镮CON uv會(huì)被重置為大于1,而字體貼圖尋址模式必須是 Clamp 。
例如:

3.使用新的字體材質(zhì)。

1 fixed4 frag (v2f i) : SV_Target
2 {
3     fixed4 col = i.color;
4     col.a *= tex2D(_MainTex, i.texcoord).a;
5     // 當(dāng)檢測(cè)到 uv.x > 1 是說明是被重置的對(duì)象 那么選取 Icon 貼圖進(jìn)行顯示
6     return lerp(col, tex2D(_IconTex, i.texcoord), step(1, i.texcoord.x));
7 }

4.啟動(dòng)時(shí)候重新映射特殊字符UV E7CC-E7D6
 1 public class BattleLogManager : MonoBehaviour
 2 {
 3 
 4     public static BattleLogManager Instance;
 5 
 6     public UnityEngine.UI.Text mContent;
 7 
 8     private System.Text.StringBuilder mStringBuilder = new System.Text.StringBuilder();
 9     private bool mIsDirty = false;
10 
11     void OnDestroy()
12     {
13         Instance = null;
14     }
15 
16     void OnEnable()
17     {
18         Instance = this;
19     }
20 
21     public void InsertBattleLog(int itemPrefabIndex, string str, int alignment)
22     {
23         // 大字符串合并
24         mStringBuilder.AppendLine(str);
25         // mIsDirty 避免在同一幀內(nèi)多次調(diào)用重新設(shè)置UI文本
26         mIsDirty = true;
27     }
28 
29     public void ClearAllLog()
30     {
31         mStringBuilder = new System.Text.StringBuilder();
32         mContent.text = "";
33         mIsDirty = false;
34     }
35 
36     public void LateUpdate()
37     {
38         if (mIsDirty)
39         {
40             mIsDirty = false;
41             mContent.text = mStringBuilder.ToString();
42         }
43     }
44 }

 1 public class RichTextConfig : MonoBehaviour 
 2 {
 3 
 4     public Font font;
 5     public int richIconTextureWidth = 256;
 6     public int richIconTextureHeight = 128;
 7 
 8     [System.Serializable]
 9     public struct Item
10     {
11         public int index;
12         public Sprite sprite;
13     }
14 
15     public Item[] items;
16 
17     void Start () 
18     {
19         DontDestroyOnLoad(this);
20 
21         Build();
22     }
23 
24     [ContextMenu("build")]
25     private void Build()
26     {
27         var ci = font.characterInfo;
28 
29         for (var i = 0; i < ci.Length; ++i)
30         {
31             for (var j = 0; j < items.Length; ++j)
32             {
33                 if (ci[i].index == items[j].index)
34                 {
35                     var rect = items[j].sprite.textureRect;
36                     ci[i].uv = new Rect(2 + rect.x / richIconTextureWidth, rect.y / richIconTextureHeight, rect.width / richIconTextureWidth, rect.height / richIconTextureHeight);
37                 }
38             }
39         }
40 
41         font.characterInfo = ci;
42     }
43 
44 }
45 



5.字體材質(zhì)使用新的材質(zhì)

posted on 2016-05-22 18:27 l1989 閱讀(3347) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 游戲

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            羞羞答答国产精品www一本| 亚洲国产精品久久91精品| 亚洲国产日韩欧美在线动漫| 欧美一区二区女人| 国产亚洲成精品久久| 一本大道久久a久久精品综合| 免费日韩av电影| 久久久久久久久久久成人| 国产亚洲欧美一区在线观看| 久久国产精品高清| 日韩午夜中文字幕| 欧美日韩亚洲视频一区| 在线亚洲免费| 亚洲欧美国产精品桃花| 国产一区二区成人| 欧美电影免费观看高清完整版| 久久福利毛片| 欧美日韩亚洲三区| 午夜日韩av| 欧美专区日韩专区| 亚洲第一中文字幕| 欧美激情视频在线播放| 久久免费高清| 99精品热视频只有精品10| 亚洲精品偷拍| 国产精品自在欧美一区| 蜜桃伊人久久| 欧美日韩国产影院| 久久精品国产91精品亚洲| 久久久国产精品亚洲一区| 91久久国产自产拍夜夜嗨| 一本色道久久综合狠狠躁的推荐| 黑人极品videos精品欧美裸| 一区二区三区产品免费精品久久75| 国内精品久久久久久影视8| 亚洲免费观看在线观看| 在线看日韩av| 欧美一级一区| 午夜亚洲一区| 欧美日韩国产首页| 欧美福利电影在线观看| 国产婷婷精品| 亚洲无毛电影| 亚洲无限av看| 欧美片在线播放| 亚洲国产精品成人久久综合一区 | 亚洲成在线观看| 国产视频精品va久久久久久| 99人久久精品视频最新地址| 亚洲欧洲偷拍精品| 美女精品国产| 免费中文字幕日韩欧美| 国语自产在线不卡| 久久成人一区二区| 久久精品国产v日韩v亚洲| 欧美性色aⅴ视频一区日韩精品| 亚洲人成精品久久久久| 亚洲精品国产精品久久清纯直播| 久久蜜桃精品| 欧美成人精品在线视频| 依依成人综合视频| 久久人人精品| 欧美激情一区二区| 亚洲精选大片| 欧美日韩国产在线播放| 亚洲人妖在线| 中文无字幕一区二区三区| 欧美日韩中文另类| 亚洲一区二区三区精品动漫| 欧美一级欧美一级在线播放| 国产伦理一区| 久久久精品动漫| 欧美顶级艳妇交换群宴| 日韩视频在线永久播放| 欧美精品一区二区高清在线观看| 亚洲欧洲一区二区天堂久久| 一区二区三区黄色| 国产精品久久久久一区二区三区| 亚洲综合色激情五月| 久久嫩草精品久久久精品| 曰韩精品一区二区| 欧美伦理影院| 亚洲欧美日韩区| 欧美a级片一区| 99精品99| 国产一区自拍视频| 欧美91视频| 亚洲一区三区电影在线观看| 久久精品视频免费观看| 91久久久亚洲精品| 国产精品美女久久久免费| 欧美一区二区三区另类| 亚洲国产日韩综合一区| 亚洲欧美另类综合偷拍| 尹人成人综合网| 国产精品vvv| 久久综合九色| 亚洲一区二区三区乱码aⅴ| 麻豆国产精品777777在线| 一本色道**综合亚洲精品蜜桃冫| 国产欧美日韩伦理| 久久亚洲私人国产精品va媚药| 亚洲免费av网站| 老司机精品导航| 亚洲制服av| 亚洲欧洲日本一区二区三区| 国产精品亚洲人在线观看| 欧美不卡在线视频| 午夜精品成人在线| 亚洲人成在线免费观看| 久久久综合激的五月天| 亚洲欧美另类国产| 亚洲精品资源美女情侣酒店| 国产午夜精品在线| 欧美日韩亚洲高清一区二区| 久久综合精品一区| 欧美在线高清| 亚洲欧美国产视频| av成人免费| 亚洲人成人一区二区在线观看| 久久久精品一区| 欧美一区亚洲二区| 亚洲午夜精品17c| 99国产精品久久久久久久久久 | 欧美激情麻豆| 久久免费少妇高潮久久精品99| 亚洲一区中文| 中文欧美在线视频| 一本久道久久综合婷婷鲸鱼| 亚洲国产精品成人综合| 欧美刺激午夜性久久久久久久| 久久久91精品国产一区二区精品| 香蕉视频成人在线观看| 亚洲在线一区| 亚洲欧美国产高清| 亚洲免费影院| 午夜在线一区| 欧美在线视频日韩| 欧美中文字幕在线| 久久精品免视看| 久久久久国产一区二区| 久久精品网址| 久久亚洲视频| 欧美成人高清| 亚洲福利视频一区| 亚洲精品无人区| 亚洲一区在线免费| 先锋影音网一区二区| 欧美在线视频导航| 久久久激情视频| 欧美大片免费久久精品三p| 欧美激情无毛| 国产精品theporn| 国产日韩欧美亚洲| 亚洲成人在线网| 一区二区欧美国产| 亚洲欧美电影在线观看| 欧美主播一区二区三区美女 久久精品人 | 国产亚洲欧美一区在线观看 | 欧美日韩精品免费观看视一区二区 | 亚洲乱码国产乱码精品精| 亚洲精品乱码久久久久久按摩观| 日韩网站在线| 欧美一区二区三区免费视频| 久久精品二区亚洲w码| 欧美第一黄色网| 欧美性视频网站| 伊人春色精品| 在线一区二区三区四区五区| 欧美一区二区精美| 亚洲二区视频| 亚洲欧美日韩综合| 免费欧美电影| 国产模特精品视频久久久久| 亚洲成人在线免费| 午夜精品福利电影| 欧美激情精品久久久六区热门 | 黄色精品一区二区| 日韩网站在线观看| 久久久久综合网| 亚洲看片免费| 久久婷婷综合激情| 国产精品男gay被猛男狂揉视频| 在线播放视频一区| 亚洲欧美亚洲| 亚洲欧洲日产国产综合网| 午夜免费在线观看精品视频| 欧美成黄导航| 狠狠色狠色综合曰曰| 亚洲永久字幕| 亚洲日产国产精品| 久久久久女教师免费一区| 国产精品理论片| 一本大道久久精品懂色aⅴ| 久久久久久久成人| 亚洲免费视频成人| 欧美午夜片欧美片在线观看| 亚洲精品一区二区三区99| 久久久综合香蕉尹人综合网| 亚洲午夜av电影|