天天看點

【狂雲歌之unity_vr】unity裡擷取text中文字寬度并截斷省略【狂雲歌之unity_vr】unity裡擷取text中文字寬度并截斷省略

【狂雲歌之unity_vr】unity裡擷取text中文字寬度并截斷省略【狂雲歌之unity_vr】unity裡擷取text中文字寬度并截斷省略

 在unity的ugui中text控件,有時我們會有各種各樣的需求,比如類似html中css的text-overflow屬性,希望一段文字如果不夠長就全顯示,如果特别長就截斷并且後面加上例如...這種字尾。

 好吧這樣的需求在ugui裡貌似沒有現成的方法,如果有的話麻煩指點一下~

 大概的思路就是

首先要能判斷什麼時候overflow

并且支援加上字尾

 那麼text控件本來是支援overflow然後直接截斷的,但是比較暴力,直接砍斷,不能加字尾,并不滿足我們的需求。

 然後如果簡單的通過字元個數截斷,那根本不行,如果根據中英文字元來根據長度截斷,這個我試過,然而字型并不一定是一個中文相當于倆英文字元,于是乎如果有一大排lllll或者iii什麼的,悲劇無以言表。

 是以我們需要知道一段文字所對應的渲染之後的長度。如果從text的preferwidth或者通過添加content size filter元件應該也能完成類似任務,不過我傾向于直接算好長度去填充。

 這個功能核心代碼為

 其中text為text文本控件,<code>requestcharactersintexture</code>主要相當于指定需要渲染哪些字元(然後根據<code>characterinfo.characterinfo</code>是可以拿到本次生成的去重後的字元集)。接下來通過<code>myfont.getcharacterinfo(c, out characterinfo, text.fontsize);</code>分别去獲得每個字元的資訊,然後<code>characterinfo.advance</code>就拿到了每個字元的渲染長度。

 拿到每個字元長度之後那就簡單多了,計算一下需要截斷的字元總長度,如果大于限制長度,就除去字尾長度後,截取子字元串,然後再接上字尾。這個事情就搞定了。

效果如下:

【狂雲歌之unity_vr】unity裡擷取text中文字寬度并截斷省略【狂雲歌之unity_vr】unity裡擷取text中文字寬度并截斷省略

全部如下,這個例子是需要一個text和一個button,點選button,随機生成文字在text上。

這個效果基本達到要求,如果仔細看的話,并不能保證每個截取後的字元串一定是對齊的,這個也跟字元串有關,畢竟字元串長度是離散的,貌似沒有辦法像word一樣在一行多一個文字的時候還可以擠一擠放下~

繼續閱讀