UGUI中隨意調整Text中的字型間距

2021-09-05 08:38:32 字數 2742 閱讀 8541

ugui中是沒有可以隨意調整字型間的距離的方法,仔細研究一下可以通過控制每個字型的網格頂點位置進行調整字型之間的距離,

分析一下最簡單情況:輸入的文字是單行的,且末尾沒有換行符;

unity在unityengine.ui命名空間中定義了乙個basemesheffect抽象類,他提供了乙個抽象方法modifymesh(vertexhelper vh),使得可以輕鬆地獲得text文字中所有字型 的頂點資訊,我們的移動字型的操作將在這裡面進行。vertexhelper類主要是用於提供字型網格資料的工具類;

上述便是掛載testspacingtext指令碼之後的效果圖。下面貼出**

using system.collections;

using system.collections.generic;

using unityengine;

using unityengine.ui;

public class textspacingtest : basemesheffect

if (i % 6 == 4)}}

}

分析**:

1)首先建立乙個字型間距的變數,然後需要繼承basemesheffect類並且實現其中的抽象的方法meshmodify()函式。

2)建立乙個容器從網格資訊生成器vh中將字型的頂點資訊全部載入儲存下來

3)接下來開始遍歷獲取到的頂點,我們知道每個字型是由兩個三角形的組成的網格,字型是顯示在這樣的網格上的,因此每個字型也就對應6個頂點。那麼就開始移動每個頂點就可以了。

4)移動頂點之後要記得設定uv頂點與頂點索引的對應關係,因為乙個字型網格由兩個三角形組成,那麼就重疊了兩個頂點,故而乙個字型的6個頂點,就只對應4個uv頂點索引,如上**顯示的那樣。

分析如下:

接下來看看比較複雜的情況:

文字的情況為,可以有多行,或單行,單行、多行時末尾均可以有換行符。

核心思路:

1)先考慮僅僅是多行且末尾行的末尾沒有換行符的情況,解決了這個核心問題,再考慮其他的問題。

2)將多行的文字按照換行符進行分割,這樣每一行就形成了乙個字串,此時對每一行進行上面簡單的操作,就可以實現移動的了。

3)考慮到所有的文字的頂點資訊資料都儲存在vh中,可以建立乙個行資料結構line以此來儲存每行的基本屬性(比如:本行開始定點的索引位置,結束頂點的索引位置,所有頂點的數量)。

4)簡單多行的情況,利用上面的分行的思路就可以解決,接下來分析其他的問題。

5)單行時末尾有換行符,我們在分割字串之後要加以判斷是否有空串的情況 ,若有那麼就認為末尾產生了換行符,此時空串不再建立line物件,只用建立乙個line物件。解法看**。

6)多行時末尾有換行符,同樣用於上面一樣的方法進行檢驗,最後乙個空串不在建立line物件,解法看**。

7)之後若是想擴充套件修改字型垂直方向的間距也可以在此基礎上修改,非常簡單。

接下來看**:

using unityengine;

using system.collections;

using unityengine.ui;

using system.collections.generic;

internal class line

}//每行結束頂點索引

private int endvertexindex;

public int endvertexindex

}//每行頂點總量

private int countvertexindex;

public int countvertexindex

}public line(int startvertexindex,int countvertexindex)

}/// /// 這是設定字型移動的核心類

/// 執行多重行移動的核心演算法是:將多重行分開依次進行處理,每一行的處理都是前面對單行處理的子操作

/// 但是由vh是記錄乙個文字中所有的字的頂點,所以說需要分清楚每行開始,每行結束,以及行的字個數,

/// 如此需要建立乙個行的資料結構,以儲存這些資訊

///

public class textspacingmultest : basemesheffect

else

"ls長度" + ls.length);

for (int i = 0; i < line.length; i++)

if (i == 0&&line.length>=1)//解決單行時有換行符的情況,以及多行時i為0的情況

else

else

else}}

}listvertexs = new list();

vh.getuivertexstream(vertexs);

int countvertexindex = vertexs.count;

"頂點總量" + vertexs.count);

for (int i = 0; i < line.length; i++)

for (int k = line[i].startvertexindex+6; k <= line[i].endvertexindex; k++)

if (k % 6 == 4)}}

}}

UGUI實現隨意調整Text中的字型間距

ugui中是沒有可以隨意調整字型間的距離的方法,仔細研究一下可以通過控制每個字型的網格頂點位置進行調整字型之間的距離,分析一下最簡單情況 輸入的文字是單行的,且末尾沒有換行符 unity在unityengine.ui命名空間中定義了乙個basemesheffect抽象類,他提供了乙個抽象方法modi...

UGUI的text賦值問題 速度

僅是簡單的給乙個ugui.text元件不斷的賦值字串,就會帶來很高的cpu消耗,約0.5ms左右。這個過程主要是消耗在字型的mesh頂點重建。在遊戲中變化的字型一般不多,聊天面板雖然變化,重新整理率不高 moba遊戲 然後就是金錢變化的顯示,網路延遲的顯示,fps的顯示。優化想法 對於字串長度不發生...

unity的UGUI筆記(二) Text

text是ui中顯示文字的元件,中文模式下很多都可以輕鬆理解其中的含義 以下是比較重要的東西 1.幾何對齊 以文字框為參考對齊,使用後更好的對齊貼合文字框,就像把word的 邊框去掉直接對齊一樣 個人理解 2.富文字 使用後可以支援字型調節,顏色,大小,粗細 3.水平 垂直溢位 使用overflow...