unity中的Text組件如何獲得其中文本的尺寸

獲得Text中文本尺寸的方法有兩種:
(1)比較笨的方法是,預先計算出每個字符的尺寸,比如“Oh我的Baby”這句話,想要知道他的物理尺寸,需要知道每個英文字符的物理尺寸和每個中文字的物理尺寸。可以預先將26個英文字符都測量一下(包括大寫字符),中文字符基本上就等於Text.FontSize的尺寸,將這些尺寸數據存到Json文件中,然後解析獲得配置字典。然後解析這句歌詞。將他轉化成字符遍歷,依次分割每個單詞和每個中文字符,分割之時計算每個單詞和每個中文字符的尺寸。每個單詞每個字符的尺寸計算出來之後就可以計算出整句話的長度了。
附上一段代碼:
核心的思路是:遍歷每個字符,執行如下操作:
(1)判斷當前字符若是中文字符if (sentence[i] >= 0x4e00 && sentence[i] <= 0x9fbb)就將他劃分成一個字符並將他的尺寸記錄到perFontSizeCach集合中,同時要看該字符之前是否有字符,若有字符判斷該字符是空格、是中文字符還是英文字符,若是空格或者中文字符就不管,若是英文字符就將前面累計的尺寸perFontLen的字符劃分爲一個單詞,同時將累計尺寸perFontLen放到perFontSizeCache中。此外要把標記前一個字符是中文字符的布爾變量preCharIsChinesetrue;
(2)若當前字符不是中文字符,那麼判斷當前字符是否被包含在配置字典中LyricsManager.Instance.CharToSizeMap,如果該字符不包含在配置字典中,就認爲他是一個單詞的一部分,他的尺寸都統一默認按48處理,累加到perFontLen上。若該字符被包含在該字典中,那麼就判斷preCharIsChinese是否true,若爲true即前一個字符是中文字符那麼就認爲當前字符是屬於當前字符的一部分,獲得他的尺寸並添加到累加尺寸上perFontLen += LyricsManager.Instance.CharToSizeMap[sentence[i].ToString()];如果前一個字符是非中文字符,那麼判斷是否屬於一句話的第一個字符、前一個字符是否爲空格及當前字符是否爲空格,若滿足上述三種情況,那麼就認爲之前的字符串爲一個單詞,進行分割,將之前累加的字符尺寸perFontLen添加到每個字尺寸緩存perFontSizeCacheperFontSizeCach.Add(perFontLen);,此外此時要將當前的空格尺寸視爲是下一個字的一部分,將它的尺寸累加perFontLen = LyricsManager.Instance.CharToSizeMap[" "];,最後需要將前一個字符是中文字符變量preCharIsChinesefalse
(3)最後在每次遍歷最後都要判斷是否是最後一個字符,及前一個字符是否是中文字符,若是最後一個字符,且前一個字符不是中文字符,那麼就將前面累加字符添加到perFontSizeCacheperFontSizeCach.Add(perFontLen);。因爲在最後一個字爲英文單詞可能沒法劃分爲一個字,用這種方法來維持一致性。

        totalSize = 0;
        bool preCharIsChinese = false;
        float perFontLen = 0;
        perFontSizeCach.Clear();
        for (int i = 0; i < sentence.Length; i++)
        {
            if (sentence[i] >= 0x4e00 && sentence[i] <= 0x9fbb)
            {//根據Unicode編碼知在這個範圍內的字符爲中文字符
                if (i > 0 && sentence[i - 1] != ' ' && preCharIsChinese == false)
                {
                    //分割前面的爲一個英文字
                    perFontSizeCach.Add(perFontLen);
                    perFontLen = 0;
                }
                perFontLen += text.fontSize;        
                perFontSizeCach.Add(perFontLen);
                preCharIsChinese = true;
                perFontLen = 0;
            }
            else
            {
                if (LyricsManager.Instance.CharToSizeMap.ContainsKey(sentence[i].ToString()))
                {//這個字典中就是記錄着每個字符的物理尺寸
                    if (preCharIsChinese == false)
                    {
                        if (i > 0 && sentence[i - 1] != ' ' && sentence[i] == ' ')
                        {
                            //分割前面的爲一個英文字
                            perFontSizeCach.Add(perFontLen);
                            perFontLen = 0;
                            perFontLen = LyricsManager.Instance.CharToSizeMap[" "];
                        }
                        else
                        {
                            perFontLen += LyricsManager.Instance.CharToSizeMap[sentence[i].ToString()];
                        }
                    }
                    else
                    {
                        perFontLen += LyricsManager.Instance.CharToSizeMap[sentence[i].ToString()];
                    }

                }
                else
                {
                    perFontLen += text.fontSize;
                }
                preCharIsChinese = false;
            }
            if (i == sentence.Length - 1 && preCharIsChinese == false)
            {
                perFontSizeCach.Add(perFontLen);
                perFontLen = 0;
            }
        }

(2)另一種方法是比較先進的方法,直接利用Text組件中的給定的API來求得。我們知道Text中有Font引用,在該引用中包含有該Text引用的字體,其實一個字符串也就是放到一個Font中,通過Font將他渲染到對應的紋理上以顯示出來的。而Text只是提供了一種間接管理的作用。從接收字符串,然後傳給Font文本字符串及一些其他的比如字體尺寸、字體風格等參數,然後Font將把字體渲染出來。Font中包含了很多屬性和方法以便於進行顯示處理。
在該處首先獲得Text的Font實例。我們想要獲得一個文本的尺寸,那麼就需要先將文本渲染到紋理上Font.RequestCharactersInTexture(),這樣Font上纔會包含該文本數據。在Font中文本是按照一個一個字符繪製的,所以也應該按照一個一個字符去取到每個字符的信息CharacterInfo。在每個字符信息中包含有當前字符的尺寸CharacterInfo.advance,由此將每個字符的尺寸相加便可得出文本的尺寸。

	    Font sentenceFont = text.font;//獲得Font的實例
        sentenceFont.RequestCharactersInTexture(sentence, 48, text.fontStyle);//先將文本繪製出來,
        //由此處可以看出影響文本繪製的因素很多,有字體尺寸和字體風格等
        CharacterInfo fontInfo;
        char[] arr = sentence.ToCharArray();
        for (int i = 0; i < arr.Length; i++)
        {
            sentenceFont.GetCharacterInfo(arr[i], out fontInfo, 48);//根據字符獲取字符的信息
            totalSize += fontInfo.advance;//將字符尺寸累加
        }
	
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章