【Unity】ugui圖文混排實(shí)現(xiàn)

寫在前面呼奢,最近在寫聊天系統(tǒng),這里面就有一個(gè)很重要的環(huán)節(jié)就是表情與文字混排需要解決本橙。前段時(shí)間有客戶說微信登錄,有的人微信名字含有emoji脆诉,這樣直接使用會(huì)顯示亂碼甚亭。就一起解決了。

功能

◆打包圖集
◆圖文混排
◆使用輸入法直接輸入emoji轉(zhuǎn)化顯示

怎么用击胜?

打包圖集

點(diǎn)擊Tool->Bake Emoji Atlas然后設(shè)置好各個(gè)選項(xiàng)點(diǎn)擊生成即可亏狰。

顯示emoji

EmojiTextManager.Instance.SetChatTextEmoji(Emoji, "{emoji:54}Emoji表情{emoji:4}", "54|4|", emojiAtlas);

使用這個(gè)是已知emoji的id,用于聊天表情框選擇等偶摔。

EmojiTextManager.Instance.SetUITextThatHasEmoji(inputEmoji, "自行車: \U0001F6B4, 國(guó)旗: \U0001F1FA\U0001F1F8", emojiAtlas);

使用于用戶直接用輸入法輸入emoji或者獲得網(wǎng)絡(luò)消息中含有emoji的Unicode的時(shí)候暇唾。

EmojiTextManager.Instance.SetUITextThatHasIconByAtlas(qq, "{emoji:44}QQ{emoji:55}表情{emoji:4}", iconAtlas);

與第一個(gè)同樣,區(qū)別在于這是使用自定義的圖集辰斋。

EmojiTextManager.Instance.ConvertInputFieldText(str);

用于用戶使用輸入法輸入emoji策州,顯示輸入框中的表現(xiàn)。

填充數(shù)據(jù)

EmojiTextManager.Instance.ParseEmojiInfo(resStr);
EmojiTextManager.Instance.ParseNormalIcon(resStr);

這個(gè)需要在使用顯示圖片之前調(diào)用宫仗。

具體實(shí)現(xiàn)

打包圖集

圖集工具

設(shè)置好上面的參數(shù)够挂。生成會(huì)把圖片文件夾中的圖片遍歷打到一個(gè)Texture2D中,然后把每張圖片在圖集的位置大小記錄下來藕夫,然后把這些數(shù)據(jù)存入xml文件中孽糖。在生成每個(gè)表情時(shí)可以設(shè)置UV來確定哪一個(gè)圖片枯冈。

圖文混排

這個(gè)功能在網(wǎng)上看到大多是使用的富文本加重寫Text組件來實(shí)現(xiàn)的。這次并沒有使用這個(gè)方案办悟,
使用的Git上面的這個(gè)開源方案霜幼,但是這個(gè)方案有一個(gè)致命問題——只適用于一個(gè)分辨率。解決這個(gè)問題的方案是使用了NGUI中的使文字漸變的功能的原理誉尖。

public class EmojiEffect : BaseMeshEffect{
       public override void ModifyMesh(VertexHelper vh){}
}

繼承與BaseMeshEffect抽象類,然后重寫ModifyMesh方法铸题。這個(gè)方法會(huì)在你修改文字時(shí)調(diào)用铡恕。值得注意的是這個(gè)方法在編輯器下也會(huì)調(diào)用。然后使用下面的代碼獲得文字的頂點(diǎn)丢间。

var vertexList=newList<UIVertex> ();
vh.GetUIVertexStream(vertexList);

這里的每一個(gè)文字有6個(gè)頂點(diǎn)探熔。第一個(gè)和最后一個(gè)頂點(diǎn)在一個(gè)位子,以順時(shí)針增加烘挫,第三個(gè)和第四個(gè)頂點(diǎn)是在一起诀艰。如下示意圖:

頂點(diǎn)示意圖

根據(jù)頂點(diǎn)位子來確定表情位置,在表情的位置使用了占位符替換饮六。

private const char emSpace = '\u2001';

根據(jù)字符串匹配判斷表情在那個(gè)字符的后面其垄。可以看看這篇文章使用正則表達(dá)式匹配卤橄,當(dāng)然也有使用直接遍歷比對(duì)绿满。

寫在后面

這個(gè)里面還有很多沒有優(yōu)化,一些東西也沒有改窟扑,等后面有時(shí)間了再來修改吧喇颁。:-)
先寫這么多吧。
嗯嚎货,一定要好好鍛煉橘霎,好好減肥!
這個(gè)是工程地址殖属。

2017/11/24更新

這里有一個(gè)小提示姐叁,這個(gè)顯示功能需要在物體激活狀態(tài)才會(huì)正常運(yùn)行,當(dāng)然這里有一個(gè)特殊情況就是打開一個(gè)界面需要運(yùn)行此方法忱辅,但是立馬又關(guān)閉了這個(gè)界面七蜘,會(huì)有一個(gè)小的報(bào)錯(cuò),如果是切頁(yè)類型的話墙懂,就會(huì)造成顯示錯(cuò)誤橡卤。

2017/12/14更新

如果文字被截?cái)嗔耍@里需要做一下判斷损搬,不然會(huì)報(bào)空碧库。應(yīng)該是文字沒有被渲染出來柜与,所以頂點(diǎn)也不會(huì)有,所以這里頂點(diǎn)列表中就會(huì)越界嵌灰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弄匕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沽瞭,更是在濱河造成了極大的恐慌迁匠,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驹溃,死亡現(xiàn)場(chǎng)離奇詭異城丧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)豌鹤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門亡哄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人布疙,你說我怎么就攤上這事蚊惯。” “怎么了灵临?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵截型,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我儒溉,道長(zhǎng)菠劝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任睁搭,我火速辦了婚禮赶诊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘园骆。我一直安慰自己舔痪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布锌唾。 她就那樣靜靜地躺著锄码,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晌涕。 梳的紋絲不亂的頭發(fā)上滋捶,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音余黎,去河邊找鬼重窟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛惧财,可吹牛的內(nèi)容都是我干的巡扇。 我是一名探鬼主播扭仁,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼厅翔!你這毒婦竟也來了乖坠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤刀闷,失蹤者是張志新(化名)和其女友劉穎熊泵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甸昏,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戈次,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了筒扒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绊寻,死狀恐怖花墩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澄步,我是刑警寧澤冰蘑,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站村缸,受9級(jí)特大地震影響祠肥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梯皿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一仇箱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧东羹,春花似錦剂桥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至冤议,卻和暖如春斟薇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恕酸。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工堪滨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蕊温。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓椿猎,卻偏偏與公主長(zhǎng)得像惶岭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子犯眠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353