【UNITY】textコンポーネントに長文を載せる
Unity では(多分Unityに限らない)テキストの文字数に制限がある。
これをなんとかする
文字数制限を突破する
利用規約をアプリ内に表示させようとTextにベタ貼り。
するとこんなエラーが出現。
string too long for TextMeshGenerator.Cutting off characters.
公式マニュアルには記載されてなかったが、調べたところ主に海外の人が同様なエラーに遭遇していることが多かった。
結論としては1万5千以上の文字数はエラーで弾かれるらしい。
スマホアプリに限らず、ソフトウェアの利用規約やプライバシーポリシーはだいたい5000~8000文字だから、ほとんど遭遇しないであろうエラーコード。
それが、英語となると大変。
今回の件はまさにそれ。英語にローカライズしたときに文字数制限に引っかかった。
中国語辺りならむしろ日本語より文字数減りそうだけど、アルファベット圏は字数が多い。
対処
使用上の問題だから、コンポーネントのコードを継承して拡張させるといったスマートな方法はどうも難しい。
力でゴリ押しするしかない。
テキストの適当なところで分割して、貼る。
分割した文をきれいに並べるために、Scroll Viewとプレファブを活用。
違和感なく表示させる
- テキストコンポーネントだけを含むプレファブを分割した数だけ用意
- それぞれにべた貼り
- 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時に読み込めば違和感なくきれいに表示される。