Unity -UGUI Text 空格換行的問題

環境
Unity 2021.1.10f1 (64-bit)

前一篇文章
Unity -UGUI Text 的基本使用方式
https://husking-studio.com/unity-ugui-text-01/

問題:Text 遇到空格會換行?

其實嚴格來說,並不是「Text 遇到空格會換行」,而是在英文系統裡,空格的後面會是一個完整的單字,這個單字如果不能全部塞進框框裡,就會自動換行,不然單字會被截掉。

所以並不是「遇到空格」會換行,而是因為「空格後面的單字塞不下」才會換行。

但如果這單字本身就太長,那還是會被截掉的。

換成中文的情況

測試程式碼1 ButtonChange.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ButtonChange : MonoBehaviour
{
    public void OnButtonClick()
    {
        string str = "他們誰也沒留意一隻黃褐色的貓頭鷹撲扇著翅膀從窗前飛過。";
        GameObject goText = GameObject.Find("txtString");
        Text t = goText.GetComponent<Text>();
        t.text = str;
    }
}

如果在程式碼的字串裡加上一個半形空格

測試程式碼2 ButtonChange.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ButtonChange : MonoBehaviour
{
    public void OnButtonClick()
    {
        string str = "他們 誰也沒留意一隻黃褐色的貓頭鷹撲扇著翅膀從窗前飛過。";
        GameObject goText = GameObject.Find("txtString");
        Text t = goText.GetComponent<Text>();
        t.text = str;
    }
}

以英文系統的邏輯,會把空格後面那一整串字當成一個很長的單字,因為塞不下,所以自動換行。

那在中文系統中,要怎麼避免這種不預期的換行狀況?

其實在中文裡,本來就不會很常出現空格,就算有,也會是全形,所以只要用全形空格,就可以避免這個問題。注意喔,是一個全形空格,不是兩個半形空格。

測試程式碼3 ButtonChange.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ButtonChange : MonoBehaviour
{
    public void OnButtonClick()
    {
        string str = "他們 誰也沒留意一隻黃褐色的貓頭鷹撲扇著翅膀從窗前飛過。";
        GameObject goText = GameObject.Find("txtString");
        Text t = goText.GetComponent<Text>();
        t.text = str;
    }
}

那我如果就是要換行呢?就是遇到必須換行的情況呢?

這種時候也不能偷懶想說使用半形空格去換行,因為會有這種情況。

測試程式碼4 ButtonChange.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ButtonChange : MonoBehaviour
{
    public void OnButtonClick()
    {
        string str = "他們 誰 也沒留意一隻黃褐色的貓頭鷹撲扇著翅膀從窗前飛過。";
        GameObject goText = GameObject.Find("txtString");
        Text t = goText.GetComponent<Text>();
        t.text = str;
    }
}

所以就要使用 \n 了。

測試程式碼5 ButtonChange.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ButtonChange : MonoBehaviour
{
    public void OnButtonClick()
    {
        string str = "他們\n誰\n也沒留意一隻黃褐色的貓頭鷹撲扇著翅膀從窗前飛過。";
        GameObject goText = GameObject.Find("txtString");
        Text t = goText.GetComponent<Text>();
        t.text = str;
    }
}

但是實務上,是很少會直接把中文字串寫在程式碼裡面的,通常是讀檔,所以我們準備一個檔案。

測試程式碼6 ButtonChange.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ButtonChange : MonoBehaviour
{
    public void OnButtonClick()
    {
        TextAsset txt = Resources.Load<TextAsset>("txt/text") as TextAsset;
        string str = txt.text;

        GameObject goText = GameObject.Find("txtString");
        Text t = goText.GetComponent<Text>();
        t.text = str;
    }
}

它很老實地把 \n 也印出來了,因為 unity 會在某個地方把 \n 自動改成 \\n,所以我們要手動再把 \\n 改回 \n 。至於這某個地方在哪我就不知道了,我懷疑是讀檔那裡。

測試程式碼7 ButtonChange.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ButtonChange : MonoBehaviour
{
    public void OnButtonClick()
    {
        TextAsset txt = Resources.Load<TextAsset>("txt/text") as TextAsset;
        string str = txt.text;
		
        str = str.Replace("\\n", "\n");

        GameObject goText = GameObject.Find("txtString");
        Text t = goText.GetComponent<Text>();
        t.text = str;
    }
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *