¿Cómo crear dinámicamente un objeto de texto de interfaz de usuario en Unity 5?

8

He estado buscando algo que debería ser simple, pero la documentación de Unity 5 al respecto está bastante desactualizada. Lo que quiero lograr es poder crear el texto de la interfaz de usuario totalmente desde el script, es decir, de forma totalmente dinámica; en mi aplicación de caso real, lo haré en un bucle de un número de iteraciones no predefinido.

Una búsqueda usando Google encontrará muchos ejemplos sobre cómo hacerlo, pero todos los que vi usar métodos que ya están en desuso (son anteriores a Unity versión 5) o simplemente están equivocados (no es sorpresa aquí ...). Ya sé que primero debería agregar un Canvas a mi proyecto, luego debería incluirlo using UnityEngine.UIen mi código C # y también podría declarar un texto de UI como Text _guitext.

Sin embargo, el siguiente código no funciona. Quiero decir, no es que se cuelgue, sino que no se muestra nada:

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

Peor que eso, parece que mientras se juega el juego, no aparece ningún objeto nuevo en la lista de jerarquía de objetos.

¿Podría por favor señalarme en la dirección correcta aquí? Gracias.

Kim Shutter
fuente

Respuestas:

9

Creo que lo que estás buscando es algo como lo siguiente:

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 que primero creas un GameObject vacío. Luego agrega un componente de Texto, con los parámetros locales y / o anclados específicos, establece el texto deseado y su color, luego convierte este objeto en un elemento secundario del objeto de juego vacío.

Desea recuperar la información de texto de la interfaz de usuario o conjunto de variables de ese objeto que ha creado a través de la escritura, usted puede entonces sólo tiene que utilizar yourGOname.GetComponent<Text>().text, yourGOname.GetComponent<Text>().fontetc.

Y, por supuesto, para que eso funcione debes serlo using UnityEngine.UI.

Mand
fuente
Su script de ejemplo arroja un error para 'Texto' en Texto de texto, tamaño de fuente y color. Text' does not contain a definition for texto 'y ningún método de extensión text' of type Texto' podría encontrarse (¿le falta una directiva de uso o una referencia de ensamblaje?)
Ian S
1
@IanSteffy, ¿estás seguro de que no es así porque olvidaste seguir la última línea de mi respuesta, es decir, incluir using UnityEngine.UIel comienzo del guión?
Y
3

1 ¿quieres decir que quieres cambiar el uitext dinámicamente?

Si quieres cambiarlo, primero debes adjuntar tu script al objeto del juego. Luego une tus variables. Los tutoriales se pueden encontrar aquí.

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

2 Si desea crear uitext que no esté en la Jerarquía de antemano.

Podrías usar GUI . Etiqueta GUI

Ponga las instancias creadas en OnGUI. Es como la actualización que se llama cada cuadro.

3 En realidad, la segunda respuesta no crea un objeto uitext.

Pero logrará los mismos resultados. Si realmente quieres el objeto uitext en lugar de los efectos. U puede hacerlo en un prefabricado e iniciarlo en tiempo de ejecución. Sin embargo, el uitext debe ser hijo del lienzo.

AlexWei
fuente
Gracias por tu respuesta. Sin embargo, realmente no quiero cambiar, sino crear el texto de la interfaz de usuario (sin prefabricados, textos de GUI reales). Leí esa referencia oficial, pero no hay ninguna pista sobre cómo crear textos de interfaz de usuario simplemente usando scripts (es decir, sin ponerlos en el editor). Existe esta referencia aquí, pero también muy vaga: docs.unity3d.com/Manual/HOWTO-UICreateFromScripting.html
Kim Shutter
@KimShutter El enlace que mencionaste mencionado> Para poder crear instancias dinámicas de elementos de la interfaz de usuario fácilmente, el primer paso es crear un prefabricado para el tipo de elemento de la interfaz de usuario que deseas poder instanciar
AlexWei
3

Si está buscando una solución rápida y sucia para la depuración, aún puede usar la antigua solución de Unity 4. Implemente el OnGUIevento de cualquier MonoBehavior que siempre haya activado para llamar a la clase GUI para agregar algún elemento de la IU al marco de representación actual.

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

Si desea utilizar el lienzo, debe agregar un script al lienzo que:

  1. crea un nuevo GUITextobjeto de juego
  2. establece el texto en ese objeto
  3. lo agrega de niño al transformlienzo
Philipp
fuente