Unityにおける3Dオブジェクトの頭上にTextMeshProテキストを表示する方法

2024年10月12日

ゲーム開発において、キャラクターやオブジェクトの頭上に名前やステータス情報を表示することは、ユーザーインターフェースの重要な要素です。Unityでは、TextMeshProを使用して高品質なテキストを簡単に表示できます。本資料では、3Dオブジェクトの頭上にTextMeshProテキストを表示する方法を詳しく解説します。

手順

1. シーンの準備

  • 3Dオブジェクトの配置
    • シーン内にテキストを表示したい3Dオブジェクト(例:キャラクター、アイテム)を配置します。

2. Canvasの作成と設定

  • Canvasの作成
    • ヒエラルキーウィンドウで右クリックし、UI > Canvasを選択してCanvasを作成します。
  • Canvasの設定
    • Canvasを選択し、Inspectorウィンドウで以下を設定します。
      • Render ModeWorld Spaceに設定。
      • Position(0, 0, 0)など、初期位置を設定。
      • Scale(0.01, 0.01, 0.01)など、適切なサイズにスケールダウン。

3. TextMeshProテキストの追加

  • TextMeshPro – Textの作成
    • Canvasを右クリックし、UI > Text - TextMeshProを選択してテキストオブジェクトを作成します。
  • テキストの編集
    • 作成したTextMeshProオブジェクトを選択し、Inspectorで以下を設定します。
      • Text:表示したいテキスト(例:"Player1″)。
      • Font Size:適切なサイズに設定(例:36)。
      • Alignment:中央揃えに設定。
  • RectTransformの調整
    • Anchor Presetsを中央に設定。
    • Pos X, Pos Y, Pos Zで位置を調整。

4. テキストオブジェクトの配置と追従設定

  • Canvasを3Dオブジェクトの子オブジェクトに設定
    • ヒエラルキーウィンドウでCanvasをドラッグし、対象の3Dオブジェクトにドロップします。
    • これにより、Canvas(およびその子であるTextMeshProテキスト)は3Dオブジェクトの移動に追従します。
  • テキストの位置調整
    • CanvasまたはTextMeshProオブジェクトのTransformコンポーネントで、テキストがオブジェクトの頭上に表示されるように位置を調整します。
      • 例:Pos Yをオブジェクトの高さに合わせて設定。

5. テキストがカメラを向くように設定(ビルボード効果)

  • スクリプトの作成
    • プロジェクトビューで右クリックし、Create > C# Scriptを選択して新しいスクリプトBillboard.csを作成します。
  • スクリプトの編集
   using UnityEngine;

   public class Billboard : MonoBehaviour
   {
       void LateUpdate()
       {
           // カメラの方向を向く
           transform.forward = Camera.main.transform.forward;
       }
   }
  • スクリプトのアタッチ
    • TextMeshProテキストオブジェクトにBillboardスクリプトをアタッチします。

6. スクリプトによる動的なテキスト表示(オプション)

より高度な制御が必要な場合、スクリプトでテキストを生成・制御します。

using UnityEngine;
using TMPro;

public class NameTag : MonoBehaviour
{
    public string displayName = "Player";
    public Vector3 offset = new Vector3(0, 2, 0);
    private TextMeshPro textMesh;
    private Transform camTransform;

    void Start()
    {
        camTransform = Camera.main.transform;

        // Canvasの作成
        GameObject canvasObj = new GameObject("NameTagCanvas");
        canvasObj.transform.SetParent(transform);
        canvasObj.transform.localPosition = offset;

        Canvas canvas = canvasObj.AddComponent<Canvas>();
        canvas.renderMode = RenderMode.WorldSpace;
        canvas.transform.localScale = Vector3.one * 0.01f;

        // TextMeshProの作成
        GameObject textObj = new GameObject("NameTagText");
        textObj.transform.SetParent(canvasObj.transform);

        textMesh = textObj.AddComponent<TextMeshProUGUI>();
        textMesh.text = displayName;
        textMesh.fontSize = 36;
        textMesh.alignment = TextAlignmentOptions.Center;
        RectTransform rectTransform = textMesh.GetComponent<RectTransform>();
        rectTransform.sizeDelta = new Vector2(200, 50);
    }

    void LateUpdate()
    {
        // テキストがカメラを向くようにする
        if (camTransform != null)
        {
            textMesh.transform.rotation = Quaternion.LookRotation(textMesh.transform.position - camTransform.position);
        }
    }
}

使用方法:

  1. 上記のスクリプトをNameTag.csとして保存します。
  2. 3Dオブジェクトにこのスクリプトをアタッチします。
  3. InspectorでDisplay NameOffsetを設定します。

注意点

  • Canvasのスケール
    ワールドスペースCanvasは通常サイズが大きいため、TransformScale0.01などに設定して調整します。
  • テキストの視認性
    距離や解像度によってテキストが読みにくくなる場合があります。Font SizeCanvasのスケールを調整してください。
  • パフォーマンス
    大量のオブジェクトに対して個別にCanvasを使用するとパフォーマンスに影響を与える可能性があります。必要に応じて最適化を検討してください。
  • マルチカメラ対応
    複数のカメラを使用する場合、スクリプト内でCamera.mainを適切なカメラ参照に置き換える必要があります。

まとめ

3Dオブジェクトの頭上にTextMeshProテキストを表示することで、ユーザーに対して有用な情報を提供できます。Canvasをワールドスペースで使用し、オブジェクトの子として配置することで、オブジェクトの移動や回転にテキストが追従します。ビルボード効果を追加することで、常にカメラに対して正面を向くテキスト表示が可能です。

関連リソース

参考: 本資料を活用して、ゲーム内での情報表示をより効果的に行ってください。

TextMeshPro,Unity

Posted by hidepon