2016-11-10 2 views
0

Je souhaite obtenir la largeur d'un texte en unité en utilisant C#.Unité C#, obtention de la largeur du texte/largeur du caractère de la police

Voici ce que j'essaie de faire.

int GetWidthOfMessage(string message) 
{ 
    int totalLength = 0; 

    Font font = text.font; //text is my UI text 
    CharacterInfo characterInfo = new CharacterInfo(); 

    char[] arr = message.ToCharArray(); 

    foreach (char c in arr) 
    { 
     font.GetCharacterInfo(c, out characterInfo, text.fontSize); 
     totalLength += characterInfo.advance; 
    } 

    return totalLength; 
} 

Mais retourne faux et characterInfo.advance est 0 font.GetCharacterInfo (...) tout caractère.

+0

[Selon les docs] (https://docs.unity3d.com/ScriptReference/Font.GetCharacterInfo.html) GetCharacterInfo possède un paramètre 'FontStyle'. – ChrisF

+0

Quelques éléments mis à part la question principale, pourriez-vous simplement faire une boucle dans la chaîne? il est en boucle comme s'il s'agissait d'un tableau de 'char' - vous pouvez également l'afficher et ensuite afficher la taille du message réel. –

+0

Aussi dans les docs -" Note: Vous devriez seulement besoin de l'utiliser quand vous Si le caractère ch avec la taille et le style spécifiés est présent dans la texture de la police, alors cette méthode retournera vrai, [...] Si le caractère n'est pas présent, cette méthode retourne false " - Vos personnages sont-ils aussi dans la texture de la police? – ChrisF

Répondre

3

En dehors de votre question originale. Suite à la raison pour laquelle vous faites tout cela (extension de la zone de texte en fonction du contenu du texte).

Vous pouvez utiliser le composant Content Size Fitter sur votre objet texte et définir la propriété Horizontal Fit sur Preferred Size. Et cela va résoudre votre problème.

Mise à jour:

Ajouter Layout Element composants et ainsi définir la valeur de largeur préférée à 500 par exemple et définir Horizontal Overflow propriété de texte à Wrap. Cela fonctionnera sûrement.

+0

c'est une bonne solution si je n'ai qu'un texte de ligne, mais je veux obtenir plusieurs lignes, par exemple je veux maxWidth de ma zone de texte être 500px et après que le texte devrait être 2 lignes – user3578286

+0

@ user3578286 vérifier la réponse mise à jour –

+0

1. Ajusteur de taille de contenu (ajustement horizontal - taille préférée, ajustement vertical - sans contrainte) 2. LayoutElement (largeur préférée - 500) 3. Débordement horizontal - wrap est-ce tout ce que je devrais faire? – user3578286

0

Essayez d'appeler: font.RequestCharactersInTexture(c.ToString(), text.fontSize, text.fontStyle);

Avant d'appeler: font.GetCharacterInfo(c, out characterInfo, text.fontSize);

À l'exception de '\ t', je suis tous les personnages que je avais besoin de cette façon. (Probablement préférable de demander tous les caractères à la fois, cependant).