Comment créer dynamiquement un objet texte UI dans Unity 5?

8

Je cherchais quelque chose qui devrait être simple, mais la documentation d'Unity 5 à ce sujet est assez obsolète. Ce que je veux réaliser est de pouvoir créer du texte d'interface utilisateur totalement à partir du script, c'est-à-dire de manière entièrement dynamique - dans mon application de cas réel, je le ferai dans une boucle d'un nombre d'itérations non prédéfini.

Une recherche utilisant Google trouvera de nombreux exemples sur la façon de le faire, mais tout ce que j'ai vu soit utiliser des méthodes déjà obsolètes (antérieures à Unity version 5) ou tout simplement erronées (pas de surprise ici ...). Je sais déjà que je devrais d'abord ajouter un canevas à mon projet, puis je devrais inclure using UnityEngine.UIdans mon code C #, et aussi que je pourrais déclarer un texte d'interface utilisateur comme Text _guitext.

Cependant, le code ci-dessous ne fonctionne pas. Je veux dire, ce n'est pas que ça plante, mais plutôt que rien ne s'affiche:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;


public class MyClass: MonoBehaviour {

Text _guitext;

// Use this for initialization
void Start () {
    _guitext.text = "testing";
}

// Update is called once per frame
void Update () {
}
}

Pire que cela, il semble que pendant le jeu, aucun nouvel objet n'apparaisse dans la liste de la hiérarchie des objets.

Pourriez-vous, s'il vous plaît, me montrer la bonne direction ici? Merci.

Kim Shutter
la source

Réponses:

9

Je pense que ce que vous recherchez est quelque chose comme ceci:

GameObject CreateText(Transform canvas_transform, float x, float y, string text_to_print, int font_size, Color text_color)
{
    GameObject UItextGO = new GameObject("Text2");
    UItextGO.transform.SetParent(canvas_transform);

    RectTransform trans = UItextGO.AddComponent<RectTransform>();
    trans.anchoredPosition = new Vector2(x, y);

    Text text = UItextGO.AddComponent<Text>();
    text.text = text_to_print;
    text.fontSize = font_size;
    text.color = text_color;

    return UItextGO;
}

Cela signifie que vous créez d'abord un GameObject vide. Ensuite, vous ajoutez un composant Texte, avec les paramètres locaux et / ou ancrés spécifiques, définissez le texte souhaité et sa couleur, puis vous faites de cet objet un enfant de l'objet de jeu vide.

Vous souhaitez récupérer l'interface utilisateur des informations de texte à partir variable ou ensemble de cet objet que vous avez créé via le script, vous pouvez simplement utiliser yourGOname.GetComponent<Text>().text, yourGOname.GetComponent<Text>().fontetc.

Et bien sûr, pour que cela fonctionne, vous devez l'être using UnityEngine.UI.

MAnd
la source
Votre exemple de script génère une erreur pour «Texte» dans Texte texte, taille de police et couleur. Text' does not contain a definition for text 'and no extension method text' of type Text' was found (vous manque une directive using ou une référence d'assembly?)
Ian S
1
@IanSteffy êtes-vous sûr que ce n'est pas parce que vous avez oublié de suivre la dernière ligne de ma réponse, c'est-à-dire d'inclure using UnityEngine.UIle début du script?
Mand
3

1 voulez-vous dire que vous voulez changer dynamiquement l'uitext?

Si vous voulez le changer, vous devez d'abord attacher votre script à gameobject. Liez ensuite vos variables. Des tutoriels peuvent être trouvés ici

 transform.gameObject.GetComponent<Text>().text = "123";

2 Si vous souhaitez créer uitext qui n'est pas dans la hiérarchie au préalable.

Vous pouvez utiliser l' interface graphique . Étiquette GUI

Mettez les instances créées dans OnGUI. C'est comme la mise à jour qui s'appelle chaque trame.

3 En fait, la deuxième réponse ne crée pas d'objet uitext.

Mais il obtiendra les mêmes résultats. Si vous voulez vraiment l'objet uitext au lieu des effets. Vous pouvez le faire dans un préfabriqué et l'initier lors de l'exécution. Cependant, l'uitext doit être l'enfant du canevas.

AlexWei
la source
Merci pour votre réponse. Cependant, je ne veux vraiment pas changer, mais créer le texte de l'interface utilisateur (pas de préfabriqués, de vrais textes GUI). J'ai lu cette référence officielle, mais il n'y a aucun indice sur la façon de créer des textes d'interface utilisateur simplement en utilisant des scripts (c'est-à-dire sans les mettre dans l'éditeur). Il y a cette référence ici, mais aussi très vague: docs.unity3d.com/Manual/HOWTO-UICreateFromScripting.html
Kim Shutter
@KimShutter Le lien que vous avez mentionné a mentionné> Afin de pouvoir instancier facilement des éléments d'interface utilisateur de manière dynamique, la première étape consiste à créer un préfabriqué pour le type d'élément d'interface utilisateur que vous souhaitez pouvoir instancier
AlexWei
3

Si vous cherchez une solution rapide et sale pour le débogage, vous pouvez toujours utiliser l'ancienne solution Unity 4. Implémentez l' OnGUIévénement de tout MonoBehavior que vous avez toujours actif pour appeler la classe GUI pour ajouter un élément d'interface utilisateur au cadre de rendu actuel.

void OnGUI() {
    GUI.Label(new Rect(10, 10, 100, 20), "Hello World!");
}

Si vous souhaitez utiliser le canevas, vous devez ajouter un script au canevas qui:

  1. crée un nouvel GUITextobjet de jeu
  2. définit le texte sur cet objet
  3. l'ajoute enfant à transformla toile
Philipp
la source