Unity遊戲ugui適配阿拉伯文本顯示

2021-10-08 12:18:32 字數 2852 閱讀 3582

首先介紹下阿拉伯文,阿拉伯文的顯示是右對齊、從右到左的,不僅是語序從右到左,就連乙個單詞的每個字元都是從右到左顯示的。打個比方,用大寫英文本母來代表阿拉伯字元,我們理解的"abcd  efg"(約定下文都用斜粗體表示我們理解的順序)在阿拉伯文中就會顯示成"gfe  dcba"。

另外,當阿拉伯文和英文、數字混排時,英文和數字的顯示順序又要恢復成從左到右。比如說,我們理解的"abcd hello world efg 123"(還是用大寫英文本母來代表阿拉伯字元),就會顯示成"123 gfe hello world dcba"。

除了順序,阿拉伯文還有乙個特點是,同乙個字元有多種寫法,根據這個字元是單詞的開頭、中間、結尾來選擇不同的寫法。再打個比方(還是用英文本母舉例),字元a有三種寫法:a(前連書體),a(前後連書體),"aaa"就會顯示成"

好了,上述就是阿拉伯文的特點所在,正因為這些與眾不同的特點,我們需要經過適配處理才能在unity中正常顯示。

(不得不感慨秦始皇的「書同文」太偉大了)

網上一些適配方案都是把字串適配後再賦值給ugui的text元件,通過修改資料來改變顯示。

text t;

string str;

t.text = arabicfix(str);

不過我覺得,資料和顯示最好分開,所以我把適配放在ugui的text原始碼中,在渲染的時候使用適配後的字串。就是說,text儲存的字串資料還是從左往右的(如"abcd hello world efg 123"),然後轉換成從右往左的字串("123 gfe hello world dcba"),用後者來渲染。

protect string m_text = string.empty;

private string m_showtext = string.empty;

public virtual string text

set}protected override void onpopulatemesh(vertexhelper tofill)

完整的適配方案分為5步:字元書體轉換、字串反轉、字串富文字提純、字串換行修正、字串富文字恢復,下面詳細說下每個步驟。

書體轉換這一步,我是用的網上的乙個開源外掛程式arabicsupport(原理就是先判斷這個字元是詞首,詞中還是詞尾,然後轉換成對應的前連書體、前後連書體、後連書體(這三種書體在unicode碼中有一定規則)。

上面提到的arabicsupport外掛程式也提供了字串反轉功能,但是略顯複雜,效果不是很好,所以我自己重寫了乙個。很簡單,就是用乙個棧來處理英文和數字。

string reversestr(string str)

; stackstack = new stack{};

for(int i = str.length-1; i >= 0; --i)

else

// 再插入阿拉伯字元

list.add(str[i]);}}

// 全部出棧

while(stack.count > 0)

return new string(list.toarray());

}

在說富文字提純前,先說字串換行修正。我們知道,ugui的text元件是有自動換行功能的,但遇到阿拉伯文時,這個換行就出問題了。比如說,顯示 "tttttttt 123 gfe hello world dcba"(從右往左讀的阿拉伯字串),自動換行時,會顯示成下圖,句首跑到第二行了。

tttttttt 123 gfe

hello world dcba

這個換行處理ugui沒有開源,所以要自己處理,方法是處理字串時,在適當的地方手動插入換行符'\n'。把"tttttttt 123 gfe hello world dcba"先處理成"hello world dcba\ntttttttt 123 gfe ",再用後者渲染,就能得到我們想要的效果。

hello world dcba

tttttttt 123 gfe

按照上面的換行修正方法,由於是自己處理字串,可能會把富文字截斷,所以要提取富文字中的純文字,用純文字替換掉富文字得到純文字字串,然後對純文字字串進行換行修正。提取時用到了以下正則式來匹配:

提取富文字:

()|()|()

提取富文字中的純文字:

>[^<>]+<

經過換行修正後,需要進行富文字的恢復,很簡單,在需要恢復的字元子串前後加上富文字修飾詞就好。

現有乙個從左往右讀的阿拉伯字串"abab hello world aba 123"(用大寫字母代表阿拉伯字元)

記憶體中表示為                            abab hello world aba 123

1、字元書體轉換                      aba

2、字串反轉                         123 

3、字串富文字提純                              123

4、字串換行修正                                 hello world

5、字串富文字恢復    hello world 

渲染顯示hello world

123

UGUI適配非全屏介面

最近在做ugui的適配,如果是全屏介面還好,如果介面不是全屏的,需要首先設定anchors,然後根據螢幕大小,進行縮放。在所有的ui根節點上 我們稱為uiroot 掛載乙個canvas scaler元件,這個元件是專門根據實際寬高比,對uiroot的進行縮放,這個元件中的reference reso...

unity的UGUI學習筆記

1 ugui中的層級是按先渲染者在下面,即在同乙個畫布中節點越靠上,越先渲染越在底層,畫布間用sortorder引數設定層級 2 ugui中image會擋住button的事件,這種情況只需要為image新增 canvasgroup元件,或者將button放在畫布的最下方 3 元件的對齊設定注意piv...

Unity中UGUI指令碼新增Button按鈕事件

在場景中新增ugui的button按鈕 然後在在指令碼中寫新增的事件 宣告ui using unityengine.ui 宣告場景的跳轉 using unityengine.scenemanagement 戰士模型 弓箭手模型 gameobject m warrior,m archer 戰士按鈕 弓...