Textの幅が枠内に収まりきらないとき、私たちのチームでは、以下の記事の(4) 余談
の部分を参考に、溢れない箇所でカットして、 ...
を末尾に付与しています。
[Unity] Textコンポーネントでテキストを切り捨てずに全文表示させる方法
以下に一部引用させていただきます。
public static void SetTextWithEllipsis(this Text textComponent, string value)
{
// create generator with value and current Rect
var generator = new TextGenerator();
var rectTransform = textComponent.GetComponent<RectTransform>();
var settings = textComponent.GetGenerationSettings(rectTransform.rect.size);
generator.Populate(value, settings);
// trncate visible value and add ellipsis
var characterCountVisible = generator.characterCountVisible;
var updatedText = value;
if (value.Length > characterCountVisible)
{
updatedText = value.Substring(0, characterCountVisible - 3);
updatedText += "...";
}
// update text
textComponent.text = updatedText;
}
しかし、あるとき問題が発覚しました。長い文字列に半角スペースが含まれている場合、
そのスペースで改行されてしまい、↑のコードはその1行目の終わりで可視文字列の終わりと判定されて、右にまだスペースがあるのに早々に...
が打たれて残りが全てカットされてしまうのです。(↓の中身は、「あああああ\nあああああ\nあああああ」のようになっていますが、1行目の最後の文字がリミットと判断されるようです)
かといって、TextのHorizontal OverflowをOverflowにすると、今度は全て表示可能とみなされ、...
を付与されず全部そのまま出てしまいます…。
(ただし、この問題は英語のみでは起きないようです。)
そこで、私たちがとった対策は、半角スペースをnbsp(non-breaking space)に置き換えることです。
このnbsp、htmlなどでは
としてご存知の方もいるかと思いますが、文字コードとしても存在します(\u00a0
)。
改行を誘発する半角スペースをnbspに置き換えてしまうことで、改行を抑制するわけです。
上記のコードを書き換えるなら、以下のようになります。
public static void SetTextWithEllipsis(this Text textComponent, string value, bool spaceToNbsp)
{
// create generator with value and current Rect
var generator = new TextGenerator();
var rectTransform = textComponent.GetComponent<RectTransform>();
var settings = textComponent.GetGenerationSettings(rectTransform.rect.size);
if (spaceToNbsp)
{
value = value.Replace(" ", "\u00a0");
}
generator.Populate(value, settings);
// trncate visible value and add ellipsis
var characterCountVisible = generator.characterCountVisible;
var updatedText = value;
if (value.Length > characterCountVisible)
{
updatedText = value.Substring(0, characterCountVisible - 3);
updatedText += "...";
}
// update text
textComponent.text = updatedText;
}
やってることとしては単純で、Populate()
の前に文字列を Replace()
しているだけです。
これで、半角スペースが含まれていても単語で区切らずに ...
を付与することができました。
英語では問題が起きないところを見るとUnityの処理の不具合のような気もしますが、ともかくこれで想定どおりの挙動になりました。