「今日まなび」は最低1日1h、ゲーム作るために学びたいことなんでもいいから学んでいくコーナー。
完全自分用でまとめることは考えなくてOK.1記事1h。(1hでどんだけ学べるかのスピード感もみていきたいので)
1hのうちに次回学ぶことも決定しておくこと
環境:unity2021.3.40f
今日の学び
TextMeshProのテキストコンポーネントは、TextMeshProとTextMeshProUGUIの2種類ある。
今回はUI用ではなくワールド配置用のTextMeshProを使ってみる。
UIと違ってカメラ移動に追従したくない場面で使いたいからだ。
とりあえず作ってみる
以下で作成することができる。
ヒエラルキーで右クリック → 3D Object → Text -TextMesh Pro
意外だったのは、TransformではなくRectTransformになっていること。RectTransformはuGUIの機構だと思っていたがそうでもないのか?

描画順の設定ができる
TextMeshProUGUIと違って、描画順の設定ができるSortingLayer,Order in Layerの設定項目がある。
Z位置が同じ複数のオブジェクトの描画順を制御したい場合はこちらを指定するのがよさそうだ。

ContentSizeFitterは使えるのか? →使える!
自分はよくテキストにContentSizeFitterをつける。テキストの文字数によって位置や周りの画像の大きさを変えたりしたいからだ。
というわけで事前にContentSizeFitterをアタッチし、以下のコードを実行したところ使えていました。
using TMPro; using UnityEngine; using UnityEngine.UI; public class Test011 : MonoBehaviour { void Start() { RectTransform rectTran = GetComponent<RectTransform>(); GetComponent<TextMeshPro>().SetText("aiueo"); //RectTransform#sizeDeltaをすぐ取得したいので更新する ContentSizeFitter csf = GetComponent<ContentSizeFitter>(); csf.SetLayoutHorizontal(); csf.SetLayoutVertical(); Debug.Log("テキストのサイズ" + rectTran.sizeDelta); } }
文字数によって吹き出しの枠サイズを変えてみたい
もう少しやりたいことに話を近づけてみる。こんな風に吹き出しの枠を文字に合わせて可変にしたいのだ。
→ 
テキストのサイズがとれたのでそれをもとに枠画像の大きさを計算してみる。
using TMPro; using UnityEngine; using UnityEngine.UI; public class Test011 : MonoBehaviour { public Transform frameSprite; void Start() { RectTransform textRectTran = GetComponent<RectTransform>(); GetComponent<TextMeshPro>().SetText("sample text dayo !!"); //RectTransform#sizeDeltaをすぐ取得したいので更新する ContentSizeFitter csf = GetComponent<ContentSizeFitter>(); csf.SetLayoutHorizontal(); csf.SetLayoutVertical(); Debug.Log("テキストのサイズ" + textRectTran.sizeDelta); //テキストにあわせて調整 Vector2 FRAME_SPRITE_SIZE = new Vector2(32, 32); //吹き出し画像の大きさ。PixcelPerUnity = 1 frameSprite.localScale = new Vector3(textRectTran.sizeDelta.x / FRAME_SPRITE_SIZE.x, textRectTran.sizeDelta.y / FRAME_SPRITE_SIZE.y, frameSprite.localScale.z); } }

ぴったりすぎるので、余白幅をテキストサイズに加算した上で枠画像の大きさを計算します。
using TMPro; using UnityEngine; using UnityEngine.UI; public class Test011 : MonoBehaviour { public Transform frameSprite; void Start() { RectTransform textRectTran = GetComponent<RectTransform>(); GetComponent<TextMeshPro>().SetText("sample text dayo !!"); //RectTransform#sizeDeltaをすぐ取得したいので更新する ContentSizeFitter csf = GetComponent<ContentSizeFitter>(); csf.SetLayoutHorizontal(); csf.SetLayoutVertical(); Debug.Log("テキストのサイズ" + textRectTran.sizeDelta); //テキストにあわせて調整 Vector2 FRAME_SPRITE_SIZE = new Vector2(32, 32); //吹き出し画像の大きさ。PixcelPerUnity = 1 Vector2 offSet = new Vector2(2, 2); //テキストぴったりにしたくないので余白幅を設定 Vector2 targetSize = textRectTran.sizeDelta + offSet; frameSprite.localScale = new Vector3(targetSize.x / FRAME_SPRITE_SIZE.x, targetSize.y / FRAME_SPRITE_SIZE.y, frameSprite.localScale.z); } }

というわけで完成
