Тайминг между выводом элементов текстового массива. Unity
Столкнулась с такой неприятной проблемой. В общем, в unity для объектов Text прописала такой код:
{
public Text textUI;
private string text = "рандомный текст";
IEnumerator Start()
{
yield return StartCoroutine(WaitAndPrint(118.0f));
StartCoroutine("showText", text);
}
IEnumerator WaitAndPrint(float waitTime)
{
yield return new WaitForSeconds(waitTime);
}
IEnumerator showText(string text)
{
int i = 0;
while (i <= text.Length)
{
textUI.text = text.Substring(0, i);
i++;
yield return new WaitForSeconds(0.1f);
}
}
}
Код рабочий. Данные строки позволяют выводить текст с задержкой символов и печать предложений выводится как бы вживую. Однако, прописывать такой код для каждого объекта (а их у меня свыше 30) только на одной сцене, слишком затратно по времени. Помощь нужна конкретно вот в чем: как правильно прописать код, чтобы в массив GameObject для Text можно было для всех объектов текста разом прописать скрипт, который будет обращаться к элементам массива (через цикл) чтобы после вывода одного у меня плавно выводился следующий после определенного промежутка времени??? Если кто-то поможет с самим кодом, буду очень благодарна.
Ответы (1 шт):
Возможно вам следует получше обдумывать, как описать проблему. Чтобы понять, что вы хотите, пришлось перечитать трижды.
Скрипт текста:
[RequireComponent(typeof(Text))] // Обязываем иметь компонент Text
public class TextPrinter : MonoBehaviour
{
private Text Text;
private void Awake()
{
Text = GetComponent<Text>(); // Кэшируем
}
public IEnumerator PrintText(string text, int delay = 0)
{
Text.text = ""; // Устаналиваем пустую строку (можно опустить, если строка изначально гарантированно пустая)
yield return new WaitForSeconds(delay); // Ждем
for (int i = 0; i <= text.Length; i++) {
Text.text = text.Substring(0, i); // Дописываем символ
yield return new WaitForSeconds(0.1f); // Ждем
}
}
}
Скрипт для вывода текстов - исправил ваш
public class TextsController : MonoBehaviour
{
public TestPrinter[] Texts; // Массив со всеми текстами - указывать из инспектора
private int delay = 1; / Время ожидания. Можно сделать константой, если это так
/// <summary>
/// Функция для вывода всех текстов по одному
/// </summary>
private IEnumerator ShowTextsOneByOne ()
{
for (int i = 0; i < Texts.Length; i++) // Проходимся по текстам
{
yield return StartCoroutine(Texts[i].PrintText("Here is text", delay)); // Вызываем при этом ожидая пока все не выведется
}
}
/// <summary>
/// Функция для вывода всех текстов сразу. Вы не просили – бонус.
/// </summary>
private void ShowAllTexts ()
{
for (int i = 0; i < Texts.Length; i++)
{
StartCoroutine(Texts[i].PrintText("Here is text", delay));
}
}
}
Если остались вопросы — задавайте. Если что-то не так понял — пишите. Если ответ помог — примите.