Как динамически создать текстовый объект UI в Unity 5?

8

Я искал что-то, что должно быть простым, но документация Unity 5 по этому вопросу довольно устарела. То, чего я хочу достичь, - это иметь возможность создавать текст пользовательского интерфейса полностью из сценария, то есть полностью динамически - в моем реальном случае приложения я буду делать это в цикле с заранее не определенным числом итераций.

Поиск с использованием Google найдет довольно много примеров того, как это сделать, но все, что я видел, либо использует методы, которые уже устарели (до версии 5 Unity), либо просто ошибочны (здесь нет ничего удивительного ...). Я уже знаю, что я должен сначала добавить Canvas в свой проект, затем я должен включить его using UnityEngine.UIв мой код C #, а также что я мог бы объявить текст UI как Text _guitext.

Однако приведенный ниже код не работает. Я имею ввиду, дело не в том, что он вылетает, а в том, что ничего не отображается:

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

Хуже того, кажется, что во время игры никакой новый объект не появляется в списке иерархии объектов.

Не могли бы вы указать мне в правильном направлении здесь? Спасибо.

Ким Шуттер
источник

Ответы:

9

Я думаю, что вы ищете что-то вроде следующего:

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

Это означает, что вы сначала создаете пустой GameObject. Затем вы добавляете компонент Text с определенными локальными и / или привязанными параметрами, устанавливаете нужный текст и его цвет, а затем делаете этот объект дочерним по отношению к пустому игровому объекту.

Вы хотите получить информацию о UI Text из или набора переменных этого объекта вы создали с помощью сценария, вы можете просто использовать yourGOname.GetComponent<Text>().text, yourGOname.GetComponent<Text>().fontи т.д.

И конечно, чтобы это работало, нужно быть using UnityEngine.UI.

MAND
источник
В вашем примере сценария выдается ошибка «Текст» в текстовом тексте, размере шрифта и цвете. Text' does not contain a definition for текст 'и метод расширения text' of type Text' не найден (вам не хватает директивы using или ссылки на сборку?)
Ian S
1
@IanSteffy Вы уверены, что это не потому, что вы забыли следовать последней строке моего ответа, то есть включить using UnityEngine.UIв начале сценария?
И
3

1 ты имеешь в виду, что хочешь динамически изменять uitext?

Если вы хотите изменить его, сначала вы должны прикрепить свой скрипт к игровому объекту. Затем свяжите свои переменные. Уроки можно найти здесь

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

2 Если вы хотите создать uitext, который не находится в Иерархии заранее.

Вы могли бы использовать графический интерфейс . GUI Label

Поместите созданные экземпляры в OnGUI. Это как обновление, которое называется каждый кадр.

3 На самом деле второй ответ не создает объект uitext.

Но он достигнет тех же результатов. Если вам действительно нужен объект uitext вместо эффектов. Вы можете сделать это в префабе и запустить его во время выполнения. Тем не менее, uitext должен быть дочерним элементом canvas.

AlexWei
источник
Спасибо за Ваш ответ. Тем не менее, я действительно не хочу, чтобы изменить, но создавать текст пользовательского интерфейса (без префабов, реальных текстов графического интерфейса). Я прочитал эту официальную ссылку, но в ней нет ни малейшего понятия о том, как создавать тексты пользовательского интерфейса, просто используя скрипты (т.е. не помещая их в редактор). Здесь есть эта ссылка, но также очень расплывчатая: docs.unity3d.com/Manual/HOWTO-UICreateFromScripting.html
Ким
@KimShutter Ссылка, о которой вы упомянули, упомянутая> Чтобы иметь возможность легко создавать экземпляры элементов интерфейса динамически, первым шагом является создание префаба для типа элемента интерфейса, который вы хотите иметь возможность создавать
AlexWei
3

Если вы ищете быстрое и грязное решение для отладки, вы все равно можете использовать старое решение Unity 4. Осуществить OnGUIмероприятие любого MonoBehavior вы должны всегда активны , чтобы вызвать класс GUI , чтобы добавить элемент пользовательского интерфейса для текущего кадра рендеринга.

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

Если вы хотите использовать холст, вам нужно добавить скрипт на холст, который:

  1. создает новый GUITextигровой объект
  2. устанавливает текст для этого объекта
  3. добавляет это как ребенок к transformхолсту
Philipp
источник