【Unity】Textの行数を指定して文字列を調整する


概要

  • UGUIでUIを作成する場合、レイアウトからはみ出さないように行数を指定して文字列の長さを調整する手法を紹介します

  • 指定行数をオーバーした場合、下記の表示ができるようになります

基本

TextGeneratorというクラスを使います。この中に lineCountというプロパティがあるのでこれを利用します

例えばこのUIの場合、下記のスクリプトを使うとログに7が出力されます
なお、このスクリプトの場合最初の数フレームは0が出力されます。
つまり、一度表示しないと行数が取得できないのでひと工夫が必要となります。

public class LineTest : MonoBehaviour
{
    [SerializeField] Text textComponent;

    void Update()
    {
        Debug.Log(this.textComponent.cachedTextGeneratorForLayout.lineCount);
    }
}

レイアウトからはみ出さないように文字列を加工する

TextComponentにセットする前に行数を計算し、それ以上になったら「...」と表示するようにします

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

public class TextLimit : MonoBehaviour
{
    [SerializeField] Text textComponent;
    [SerializeField] int lineLimit = 6;

    public void SetText(string originalText)
    {
        var text = originalText;
        var textLength = originalText.Length;
        //TextGenerationSettingにはTextのRectSizeを渡す
        var setting = this.textComponent.GetGenerationSettings(new Vector2(this.textComponent.rectTransform.rect.width, this.textComponent.rectTransform.rect.height));
        var generator = this.textComponent.cachedTextGeneratorForLayout;
        while (true)
        {
            //Populate関数を使って一度評価を行う
            generator.Populate(text, setting);
            if (generator.lineCount > this.lineLimit)
            {
                //指定の行数より長い場合1文字削って試す
                textLength--;
                text = text.Substring(0, textLength) + "...";
            }
            else
            {
		//指定行数に収まったのでTextに文字列を設定する
                this.textComponent.text = text;
                break;
            }
        }
    }

#if UNITY_EDITOR
    [ContextMenu("Test1")]
    void Test1()
    {
        SetText("私わたくしはその人を常に先生と呼んでいた。");
    }

    [ContextMenu("Test2")]
    void Test2()
    {
        SetText("私わたくしはその人を常に先生と呼んでいた。だからここでもただ先生と書くだけで本名は打ち明けない。");
    }

    [ContextMenu("Test3")]
    void Test3()
    {
        SetText("This section of the documentation contains details of the scripting API that Unity provides. ");
    }
#endif
}

Test1を実行。指定行数内なのでそのまま表示

Test2を実行。指定行数をはみ出したので「...」で省略して表示

Test3を実行。英語でも問題なく動く