Come creare dinamicamente un oggetto di testo dell'interfaccia utente in Unity 5?


8

Ho cercato qualcosa che dovrebbe essere semplice, ma la documentazione di Unity 5 su questo è abbastanza obsoleta. Quello che voglio ottenere è essere in grado di creare UI Text totalmente dallo script, cioè in modo completamente dinamico - nella mia applicazione nel caso reale, lo farò in un ciclo di numero di iterazioni non predefinito.

Una ricerca con Google troverà molti esempi su come farlo, ma tutto ciò che ho visto utilizza metodi che sono già deprecati (sono precedenti a Unity versione 5) o semplicemente sbagliati (nessuna sorpresa qui ...). So già che dovrei prima aggiungere un Canvas al mio progetto, quindi dovrei includere using UnityEngine.UInel mio codice C #, e anche che potrei dichiarare un UI Text simile Text _guitext.

Tuttavia, il codice seguente non funziona. Voglio dire, non è che si blocca, ma piuttosto che non viene mostrato nulla:

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 () {
}
}

Peggio ancora, sembra che mentre si gioca, nessun nuovo oggetto appare nella gerarchia degli oggetti.

Potresti indicarmi la giusta direzione qui, per favore? Grazie.

Risposte:


9

Penso che quello che stai cercando sia qualcosa come il seguente:

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;
}

Significa che devi prima creare un GameObject vuoto. Quindi aggiungi un componente Testo, con i parametri specifici locali e / o ancorati, imposta il testo desiderato e il suo colore, quindi rendi questo oggetto figlio dell'oggetto di gioco vuoto.

Si desidera recuperare le informazioni di testo o UI da serie variabile di quell'oggetto che hai creato tramite script, è possibile poi basta usare yourGOname.GetComponent<Text>().text, yourGOname.GetComponent<Text>().fontecc

E, naturalmente, affinché funzioni, devi esserlo using UnityEngine.UI.


Lo script di esempio genera un errore per "Testo" in Testo testo, dimensione carattere e colore. Text' does not contain a definition for text 'e nessun metodo di estensione text' of type Text' è stato trovato (ti manca una direttiva using o un riferimento di assembly?)
Ian S

1
@IanSteffy sei sicuro che non lo sia perché ti sei dimenticato di seguire l'ultima riga della mia risposta, ovvero di includere using UnityEngine.UIall'inizio della sceneggiatura?
MAnd

3

1 vuoi dire che vuoi cambiare l'Uitext in modo dinamico?

Se vuoi cambiarlo, prima devi allegare il tuo script a gameobject. Quindi associa le tue variabili. I tutorial possono essere trovati qui

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

2 Se si desidera creare prima uitext che non è in Gerarchia.

È possibile utilizzare la GUI . Etichetta della GUI

Inserisci le istanze create in OnGUI. È come l'aggiornamento che si chiama ogni frame.

3 In realtà la seconda risposta non crea l'oggetto uitext.

Ma otterrà gli stessi risultati. Se vuoi davvero l'oggetto uitext invece degli effetti. Puoi farlo in un prefabbricato e avviarlo in fase di esecuzione. Tuttavia, l'uitext dovrebbe essere figlio di tela.


Grazie per la tua risposta. Tuttavia, non voglio davvero cambiare, ma creare il testo dell'interfaccia utente (senza prefabbricati, testi con GUI reali). Ho letto quel riferimento ufficiale, ma non c'è alcun indizio su come creare testi dell'interfaccia utente usando solo gli script (cioè senza metterli nell'editor). C'è questo riferimento qui, ma anche molto vago: docs.unity3d.com/Manual/HOWTO-UICreateFromScripting.html
Kim Shutter,

@KimShutter Il link che hai citato menzionato> Al fine di poter istanziare facilmente gli elementi dell'interfaccia utente in modo dinamico, il primo passo è creare un prefabbricato per il tipo di elemento dell'interfaccia utente che si desidera poter istanziare
AlexWei,

3

Se stai cercando una soluzione rapida e sporca per il debug, puoi comunque utilizzare la vecchia soluzione Unity 4. Implementa l' OnGUIevento di qualsiasi MonoBehavior che hai sempre attivato per chiamare la classe GUI per aggiungere un elemento dell'interfaccia utente al frame di rendering corrente.

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

Se si desidera utilizzare la tela, è necessario aggiungere una tela alla tela che:

  1. crea un nuovo GUITextoggetto di gioco
  2. imposta il testo su quell'oggetto
  3. lo accoda da bambino alla transformtela
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.