Wie erstelle ich dynamisch ein UI-Textobjekt in Unity 5?

8

Ich habe nach etwas gesucht, das einfach sein sollte, aber die Dokumentation zu Unity 5 ist ziemlich veraltet. Was ich erreichen möchte, ist, dass ich UI-Text vollständig aus dem Skript erstellen kann, dh vollständig dynamisch - in meiner realen Fallanwendung werde ich dies in einer Schleife von nicht vordefinierter Anzahl von Iterationen tun.

Eine Suche mit Google wird ziemlich viele Beispiele dafür finden, aber alles, was ich gesehen habe, verwendet entweder Methoden, die bereits veraltet sind (von vor Unity Version 5) oder einfach falsch sind (keine Überraschung hier ...). Ich weiß bereits, dass ich zuerst einen Canvas zu meinem Projekt hinzufügen sollte, dann using UnityEngine.UIin meinen C # -Code aufnehmen sollte und dass ich auch einen UI-Text wie deklarieren könnte Text _guitext.

Der folgende Code funktioniert jedoch nicht. Ich meine, es ist nicht so, dass es abstürzt, sondern dass nichts gezeigt wird:

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

Schlimmer noch, es scheint, dass während des Spiels kein neues Objekt in der Objekthierarchieliste angezeigt wird.

Könnten Sie mich bitte hier in die richtige Richtung weisen? Vielen Dank.

Kim Shutter
quelle

Antworten:

9

Ich denke, was Sie suchen, ist ungefähr so:

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

Es bedeutet, dass Sie zuerst ein leeres GameObject erstellen. Anschließend fügen Sie eine Textkomponente mit den spezifischen lokalen und / oder verankerten Parametern hinzu, legen den gewünschten Text und seine Farbe fest und machen dieses Objekt zu einem untergeordneten Objekt des leeren Spielobjekts.

Sie möchten die UI Textinformationen aus oder Setvariable dieses Objekt , das Sie über ein Skript erstellt haben abzurufen, können Sie dann benutzen Sie einfach yourGOname.GetComponent<Text>().text, yourGOname.GetComponent<Text>().fontetc.

Und damit das funktioniert, muss man es natürlich sein using UnityEngine.UI.

MAnd
quelle
Ihr Beispielskript gibt einen Fehler für 'Text' in Text, Schriftgröße und Farbe aus. Text' does not contain a definition for text 'und keine Erweiterungsmethode text' of type Text' konnte gefunden werden (fehlt Ihnen eine using-Direktive oder eine Assembly-Referenz?)
Ian S
1
@IanSteffy Sind Sie sicher, dass dies nicht der Fall ist, weil Sie vergessen haben, der letzten Zeile meiner Antwort zu folgen, dh die using UnityEngine.UIam Anfang des Skripts anzugeben ?
11.
3

1 meinst du, du willst den uitext dynamisch ändern?

Wenn du es ändern willst, musst du zuerst dein Skript an gameobject anhängen. Binden Sie dann Ihre Variablen. Tutorials finden Sie hier

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

2 Wenn Sie uitext erstellen möchten, das sich zuvor nicht in der Hierarchie befindet.

Sie könnten GUI verwenden . GUI-Label

Fügen Sie die erstellten Instanzen in OnGUI ein. Es ist wie das Update, das jeder Frame genannt wird.

3 Die zweite Antwort erstellt kein Uitext-Objekt.

Aber es wird die gleichen Ergebnisse erzielen. Wenn Sie wirklich das uitext-Objekt anstelle der Effekte wollen. Sie können dies in einem Fertighaus tun und es zur Laufzeit initiieren. Der Uitext sollte jedoch ein Kind der Zeichenfläche sein.

AlexWei
quelle
Danke für deine Antwort. Ich möchte jedoch wirklich nicht ändern, sondern den UI-Text erstellen (keine Fertighäuser, echte GUI-Texte). Ich habe diese offizielle Referenz gelesen, aber es gibt keinen Hinweis darauf, wie UI-Texte nur mit Skripten erstellt werden (dh ohne sie in den Editor zu stellen). Es gibt diese Referenz hier, aber auch sehr vage: docs.unity3d.com/Manual/HOWTO-UICreateFromScripting.html
Kim Shutter
@KimShutter Der Link, auf den Sie verwiesen haben> Um UI-Elemente einfach dynamisch instanziieren zu können, müssen Sie zunächst ein Fertighaus für den Typ des UI-Elements erstellen, das Sie instanziieren
möchten
3

Wenn Sie nach einer schnellen und schmutzigen Lösung für das Debuggen suchen, können Sie weiterhin die alte Unity 4-Lösung verwenden. Implementieren Sie das OnGUIEreignis eines MonoBehavior, das Sie immer aktiv waren, um die GUI-Klasse aufzurufen und dem aktuellen Rendering-Frame ein UI-Element hinzuzufügen.

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

Wenn Sie die Zeichenfläche verwenden möchten, müssen Sie der Zeichenfläche ein Skript hinzufügen, das:

  1. erstellt ein neues GUITextSpielobjekt
  2. Legt den Text für dieses Objekt fest
  3. hängt es als Kind an transformdie Leinwand an
Philipp
quelle