うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】uGUI の Text に改行されないスペースを表示させる

UnityEngine.UI.Text は英語をいい感じで表示するためなのか、
Rect の領域からはみ出る場合 スペースがあるとその位置で改行されてしまう

f:id:hacchi_man:20200118232655g:plain:w400

日本語では基本的にスペースを利用することが少ないが、
「鹿目 まどか」や「暁美ほむら」など人物名を表示する場合に姓名の間に、スペースを入れることがある
そのため、意図しないところで改行が入ってしまうことがある

f:id:hacchi_man:20200118233024p:plain:w400

魔法少女まどか☆マギカ - Wikipedia 参照

そこで改行されないスペース を入れることが改行されないようにする

改行されないスペース

正しくは「ノーブレークスペース」と呼ばれています

コンピュータにおいて、ノーブレークスペース (no-break space, non-breaking space, NBSP) は、スペースの箇所での自動的な改行(行の折り返し(英語版))を防ぐ特殊なスペースである。ノンブレーキングスペース(non-breaking space)、ハードスペース(hard space)、固定スペース(fixed space)とも呼ばれる。HTMLのようにホワイトスペース文字(英語版)の並びを1つのスペースにまとめるシステムで、行内に複数のスペースを入れるために使うこともできる。

html では   と表記されるやつで、C#Unicode で扱うため \u00A0 を利用する

以下のような Text 拡張を入れておくとスペースが常にノーブレークスペースに変換されるため便利ではあるが、string.Replace は新しい string を返すため 頻度が高かったり、長いテキストでは無駄にメモリを食ってしまうことになるので必要な箇所のみで利用するか、もともとのデータに ノーブレークスペースを入れておくべきです

public static class TextExtension
{
    public static void SetText(this Text self, string text)
    {
        self.text = text.Replace(" ", "\u00A0");
    }
}

これにより姓名間にスペースを入れても改行されなくなりました

f:id:hacchi_man:20200119003435p:plain:w400