【UNITY】textコンポーネントに長文を載せる

f:id:nuakam:20180924115239j:plain:w500

Unity では(多分Unityに限らない)テキストの文字数に制限がある。

これをなんとかする


文字数制限を突破する

利用規約をアプリ内に表示させようとTextにベタ貼り。

するとこんなエラーが出現。

string too long for TextMeshGenerator.Cutting off characters.

公式マニュアルには記載されてなかったが、調べたところ主に海外の人が同様なエラーに遭遇していることが多かった。


結論としては1万5千以上の文字数はエラーで弾かれるらしい。


スマホアプリに限らず、ソフトウェアの利用規約やプライバシーポリシーはだいたい5000~8000文字だから、ほとんど遭遇しないであろうエラーコード。
それが、英語となると大変。

今回の件はまさにそれ。英語にローカライズしたときに文字数制限に引っかかった。
中国語辺りならむしろ日本語より文字数減りそうだけど、アルファベット圏は字数が多い。

対処

使用上の問題だから、コンポーネントのコードを継承して拡張させるといったスマートな方法はどうも難しい。
力でゴリ押しするしかない。


テキストの適当なところで分割して、貼る。


分割した文をきれいに並べるために、Scroll Viewとプレファブを活用。

違和感なく表示させる

  1. テキストコンポーネントだけを含むプレファブを分割した数だけ用意
  2. それぞれにべた貼り
  3. Content( Scroll> Viewport > Content) に Vertical Layout GroupとContentSizeFilterをAdd Component.

vertical layout のchild Alignmentをupper leftに
content size filter の Vertical Fit を Preferred Size に

あとはこんな感じのスクリプトを作る

using UnityEngine;

public class TextView : Monobehaviour
{
     public GameObject TextPref1,TextPref2  .....;//分割した数だけ作る。多かった場合は構造体なり配列なりenemなり色々使う。
     public GameObject ParentPref; //プレファブの親Content

     void Start(){
       Insert(Pref1,Pref2);
     }
     private Insert(params GameObject[] Prefs)
     {
        for(int i + 0; i<Prefs.Length; i++){
           GameObject obj  = Instanitiate(Prefs[i]);  //プレファブ生成
           obj.transform.SetParent(ParentPref.transform)//親指定
           obj.transform.localscale  = new Vector3(1,1,1)
         }
     }
}

特に解説も必要なさそうだけどざっくり説明。


プレファブ作って、Contentを親に指定するだけ。それを数の分だけforループ。

何故かスケールが2.2.2と拡大されてしまうため(Unityのバグ?)スケール調整もいれた。

Start時に読み込めば違和感なくきれいに表示される。