Unityにおける3Dオブジェクトの頭上にTextMeshProテキストを表示する方法
ゲーム開発において、キャラクターやオブジェクトの頭上に名前やステータス情報を表示することは、ユーザーインターフェースの重要な要素です。Unityでは、TextMeshProを使用して高品質なテキストを簡単に表示できます。本資料では、3Dオブジェクトの頭上にTextMeshProテキストを表示する方法を詳しく解説します。
目次
手順
1. シーンの準備
- 3Dオブジェクトの配置
- シーン内にテキストを表示したい3Dオブジェクト(例:キャラクター、アイテム)を配置します。
2. Canvasの作成と設定
- Canvasの作成
- ヒエラルキーウィンドウで右クリックし、
UI > Canvas
を選択してCanvasを作成します。
- ヒエラルキーウィンドウで右クリックし、
- Canvasの設定
- Canvasを選択し、Inspectorウィンドウで以下を設定します。
- Render Mode:
World Space
に設定。 - Position:
(0, 0, 0)
など、初期位置を設定。 - Scale:
(0.01, 0.01, 0.01)
など、適切なサイズにスケールダウン。
- Render Mode:
- Canvasを選択し、Inspectorウィンドウで以下を設定します。
3. TextMeshProテキストの追加
- TextMeshPro – Textの作成
- Canvasを右クリックし、
UI > Text - TextMeshPro
を選択してテキストオブジェクトを作成します。
- Canvasを右クリックし、
- テキストの編集
- 作成したTextMeshProオブジェクトを選択し、Inspectorで以下を設定します。
- Text:表示したいテキスト(例:"Player1″)。
- Font Size:適切なサイズに設定(例:36)。
- Alignment:中央揃えに設定。
- 作成したTextMeshProオブジェクトを選択し、Inspectorで以下を設定します。
- RectTransformの調整
- Anchor Presetsを中央に設定。
- Pos X, Pos Y, Pos Zで位置を調整。
4. テキストオブジェクトの配置と追従設定
- Canvasを3Dオブジェクトの子オブジェクトに設定
- ヒエラルキーウィンドウでCanvasをドラッグし、対象の3Dオブジェクトにドロップします。
- これにより、Canvas(およびその子であるTextMeshProテキスト)は3Dオブジェクトの移動に追従します。
- テキストの位置調整
- CanvasまたはTextMeshProオブジェクトのTransformコンポーネントで、テキストがオブジェクトの頭上に表示されるように位置を調整します。
- 例:
Pos Y
をオブジェクトの高さに合わせて設定。
- 例:
- CanvasまたはTextMeshProオブジェクトのTransformコンポーネントで、テキストがオブジェクトの頭上に表示されるように位置を調整します。
5. テキストがカメラを向くように設定(ビルボード効果)
- スクリプトの作成
- プロジェクトビューで右クリックし、
Create > C# Script
を選択して新しいスクリプトBillboard.cs
を作成します。
- プロジェクトビューで右クリックし、
- スクリプトの編集
using UnityEngine;
public class Billboard : MonoBehaviour
{
void LateUpdate()
{
// カメラの方向を向く
transform.forward = Camera.main.transform.forward;
}
}
- スクリプトのアタッチ
- TextMeshProテキストオブジェクトに
Billboard
スクリプトをアタッチします。
- TextMeshProテキストオブジェクトに
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);
}
}
}
使用方法:
- 上記のスクリプトを
NameTag.cs
として保存します。 - 3Dオブジェクトにこのスクリプトをアタッチします。
- Inspectorで
Display Name
やOffset
を設定します。
注意点
- Canvasのスケール
ワールドスペースCanvasは通常サイズが大きいため、Transform
のScale
を0.01
などに設定して調整します。 - テキストの視認性
距離や解像度によってテキストが読みにくくなる場合があります。Font Size
やCanvas
のスケールを調整してください。 - パフォーマンス
大量のオブジェクトに対して個別にCanvasを使用するとパフォーマンスに影響を与える可能性があります。必要に応じて最適化を検討してください。 - マルチカメラ対応
複数のカメラを使用する場合、スクリプト内でCamera.main
を適切なカメラ参照に置き換える必要があります。
まとめ
3Dオブジェクトの頭上にTextMeshProテキストを表示することで、ユーザーに対して有用な情報を提供できます。Canvasをワールドスペースで使用し、オブジェクトの子として配置することで、オブジェクトの移動や回転にテキストが追従します。ビルボード効果を追加することで、常にカメラに対して正面を向くテキスト表示が可能です。
関連リソース
参考: 本資料を活用して、ゲーム内での情報表示をより効果的に行ってください。
ディスカッション
コメント一覧
まだ、コメントがありません