鳩の溜まり場

猫か鳩になりたい

入力された分だけ縦に伸びるInputFieldを作る【Unity】

タイトル通りのことをします。

環境

  • macOS Catalina
  • Unity 2019.3.7f1

作り方

  1. テンプレートからInputFieldをクリックしてひとまず生成。
  2. InputFieldのLineTypeを「Multi Line Newline」に設定。
  3. InputFieldに下記スクリプトをアタッチ。
using UnityEngine;
using UnityEngine.UI;

public class InputFieldHeightFitter : MonoBehaviour
{
    void Start()
    {
        var inputField = GetComponent<InputField>();
        var rectTransform = GetComponent<RectTransform>();
        var textRect = inputField.textComponent.GetComponent<RectTransform>();
        var extents = new Vector2(textRect.rect.width, textRect.rect.height);
        var stretch = rectTransform.sizeDelta - extents; // Textのstretch分を算出

        TextGenerator generator = new TextGenerator();
        TextGenerationSettings settings = inputField.textComponent.GetGenerationSettings(extents);

        inputField.onValueChanged.AddListener((text) =>
        {
            var height = generator.GetPreferredHeight(text, settings);
            var sizeDelta = rectTransform.sizeDelta;
            sizeDelta.y = height + stretch.y;
            rectTransform.sizeDelta = sizeDelta;
        });
    }
}

軽い解説

InputFieldは、InputField.cs内からTextに渡す文字列をString.Substringで範囲指定して渡しているので、InputField内で改行してもTextには表示されず、裏でデータとして保持されている状態になります。
そこで上記コードでTextGenerator.GetPreferredHeightとInputField内部のテキストデータから、高さを算出してInputFieldに当てはめることで高さを調整しています。
InputFieldの子オブジェクトであるTextはサイズをstretchにしとくことでサイズを追尾するのでぴったりなサイズになります。