[Unity] 문자열을 조정하기 위해 Text의 줄 수를 지정합니다.

11979 단어 Unityuguitech

개요


  • 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을 실행합니다.영어도 잘 돼요.

    좋은 웹페이지 즐겨찾기