using TMPro; using UnityEngine; namespace MyInfoMate.Vr.Ui { /// /// Tout le texte affiché dans le casque passe par ici. /// /// Pourquoi TextMeshPro. TextMesh rend une police bitmap : à 2,20 m /// dans un casque, chaque titre bave dès qu'on s'en approche, et c'est le premier /// truc qui fait « prototype ». TMP rend par champ de distance signée — net à /// n'importe quelle distance, pour le même coût de rendu. /// /// ⚠️ TMP a besoin de ses ressources. Window → TextMeshPro → Import TMP /// Essential Resources, une fois pour le projet. Sans elles, TMP_Settings /// n'a pas de police par défaut et un TextMeshPro n'affiche rien — /// silencieusement, dans un build. D'où le repli sur TextMesh plus bas : un /// texte laid reste lisible, un texte absent transforme une borne en casque cassé. /// public class Label : MonoBehaviour { public enum Anchor { TopCenter, MiddleCenter } /// /// TMP exprime sa taille en points, à raison de 10 points par unité de monde pour /// un objet à l'échelle 1. TextMesh, lui, multiplie fontSize par /// characterSize puis par 0,1. Les deux constantes ci-dessous n'existent /// que pour que les appelants parlent en mètres, une seule fois. /// const float TmpPointsPerMeter = 10f; const int LegacyFontSize = 96; TMP_Text _tmp; TextMesh _legacy; public static Label Create(Transform parent, string name, Anchor anchor, float lineHeightMeters, Color color) { var root = new GameObject(name); root.transform.SetParent(parent, false); var label = root.AddComponent