Como criar dinamicamente um objeto de texto da interface do usuário no Unity 5?

8

Eu tenho procurado por algo que deveria ser simples, mas a documentação do Unity 5 está bastante desatualizada. O que eu quero alcançar é ser capaz de criar texto da interface do usuário totalmente a partir do script, ou seja, de forma totalmente dinâmica - no meu aplicativo de caso real, farei isso em um loop de número não definido de iterações.

Uma pesquisa usando o Google encontrará muitos exemplos de como fazer isso, mas tudo que eu vi utilizou métodos que já foram preteridos (são anteriores à versão 5 do Unity) ou estão simplesmente errados (nenhuma surpresa aqui ...). Eu já sei que devo primeiro adicionar um Canvas ao meu projeto, incluir using UnityEngine.UIno meu código C # e também poder declarar um Texto da UI como Text _guitext.

No entanto, o código abaixo não funciona. Quero dizer, não é que ele trava, mas sim que nada é mostrado:

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

Pior que isso, parece que enquanto o jogo é jogado, nenhum novo objeto aparece na lista de hierarquia de objetos.

Você poderia me indicar a direção certa aqui? Obrigado.

Kim Shutter
fonte

Respostas:

9

Eu acho que o que você está procurando é algo como o seguinte:

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

Isso significa que você primeiro cria um GameObject vazio. Em seguida, você adiciona um componente Texto, com os parâmetros locais e / ou ancorados específicos, define o texto desejado e sua cor e transforma esse objeto em filho do objeto de jogo vazio.

Você deseja recuperar as informações de texto UI de ou conjunto de variáveis daquele objeto que você criou via script, então você pode apenas usar yourGOname.GetComponent<Text>().text, yourGOname.GetComponent<Text>().fontetc.

E, claro, para que isso funcione, você precisa ser using UnityEngine.UI.

MAnd
fonte
Seu script de exemplo gera um erro para 'Texto' em Texto, tamanho da fonte e cor do texto. Text' does not contain a definition for texto 'e nenhum método de extensão text' of type Texto' foi encontrado (você está perdendo uma diretiva de uso ou uma referência de montagem?) #
1113 Ian Ian S
11
@IanSteffy, você tem certeza de que não é porque se esqueceu de seguir a última linha da minha resposta, ou seja, de incluir a using UnityEngine.UIno início do script?
Mand
3

Como assim, você deseja alterar dinamicamente o uitext?

Se você quiser mudar, primeiro você deve anexar seu script ao objeto do jogo. Em seguida, vincule suas variáveis. Tutoriais podem ser encontrados aqui

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

2 Se você deseja criar um uitext que não esteja na Hierarquia anteriormente.

Você poderia usar a GUI . Etiqueta da GUI

Coloque as instâncias criadas no OnGUI. É como a atualização que é chamada de cada quadro.

3 Na verdade, a segunda resposta não cria um objeto uitext.

Mas alcançará os mesmos resultados. Se você realmente deseja o objeto uitext em vez dos efeitos. Você pode fazer isso em uma pré-fabricada e iniciá-la em tempo de execução. No entanto, o uitext deve ser filho da tela.

AlexWei
fonte
Obrigado pela sua resposta. No entanto, eu realmente não quero mudar, mas criar o texto da interface do usuário (sem prefabs, textos reais da GUI). Eu li essa referência oficial, mas não há nenhuma pista sobre como criar textos de interface do usuário apenas usando scripts (ou seja, sem colocá-los no editor). Não é esta referência aqui, mas também muito vago: docs.unity3d.com/Manual/HOWTO-UICreateFromScripting.html
Kim Shutter
@KimShutter O link u refere mencionado> A fim de ser capaz de elementos da interface facilmente instanciar dinamicamente, o primeiro passo é criar uma casa pré-fabricada para o tipo de elemento de interface do usuário que você quer ser capaz de instanciar
AlexWei
3

Se você estiver procurando uma solução rápida e suja para depuração, ainda poderá usar a solução antiga do Unity 4. Implemente o OnGUIevento de qualquer MonoBehavior que você sempre ativou para chamar a classe GUI para adicionar algum elemento da interface do usuário ao quadro de renderização atual.

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

Se você deseja usar a tela, é necessário adicionar um script à tela que:

  1. cria um novo GUITextobjeto de jogo
  2. define o texto nesse objeto
  3. anexa como um filho ao transformda tela
Philipp
fonte