Вывод массива сообщений на экран

В чем собственно суть дела. Для примера можно взять популярную ролевую игру Skyrim. Когда игрок берет задание, там может быть несколько пунктов, так вот часть текста выводится на экран сразу, а затем остальное с некоторой задержкой. Получается игрок видит все пункты задания и при этом сообщения, будут занимать только определенную область экрана, чтобы не забивать всё текстом. Такой способ подачи информации так-же отлично подходит для шутера, где на бегу собирается куча всякого лута, а игроку будет показано, что именно он подобрал. В общим как-то так…

Как это работает? С начало мы создаем блок, который будет содержать текст. Скрипт на основе исходного блока, будет создавать новые на том-же месте где исходный, в зависимости от настроек, старые блоки будут сдвигаться вверх или вниз, затем исчезать.

Создадим блок. Добавляем на сцену Canvas режим работы Render Mode - должен быть Screen Space - Overlay, это важно. Теперь к нашему Canvas добавим текст, настройте его визуально как нужно, переименуем объект в MessageBlock и вешаем на него скрипт с аналогичным именем:

Вывод массива сообщений на экран

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class MessageBlock : MonoBehaviour {

	public Text _text;
	public string message;
	public float lifetime;

	void Start () 
	{
		_text.text = message;
		Destroy(gameObject, lifetime);
	}
}

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

Далее, на Canvas вешаем скрипт MessageArray:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class MessageArray : MonoBehaviour {

	public static List<string> message;

	public RectTransform messageBlock;
	public int blockCount = 3;
	public float timeout = 1.5f;
	public float shift = 5;
	public float lifetime = 5;
	public bool moveUp = true;

	private float curTimeout;
	private RectTransform[] tmp;
	private RectTransform clone;

	void Awake () 
	{
		messageBlock.gameObject.SetActive(false);
		message = new List<string>();
		tmp = new RectTransform[blockCount];
		curTimeout = timeout;
	}

	void ClearArray()
	{
		bool active = false;
		foreach(string mess in message)
		{
			if(mess != string.Empty) active = true;
		}
		if(!active) message = new List<string>();
	}

	void AddNewMessage(string text)
	{
		RectTransform block = Instantiate(messageBlock) as RectTransform;
		block.gameObject.SetActive(true);
		block.SetParent(transform);
		block.anchoredPosition = messageBlock.anchoredPosition;
		block.GetComponent<MessageBlock>().message = text;
		block.GetComponent<MessageBlock>().lifetime = lifetime;
		if(blockCount > 1)
		{
			for(int i = 0; i < tmp.Length; i++)
			{
				if(tmp[i])
				{
					Vector3 move;
					if(moveUp) move = new Vector3(tmp[i].anchoredPosition.x, tmp[i].anchoredPosition.y + tmp[i].sizeDelta.y + shift, 0); 
					else move = new Vector3(tmp[i].anchoredPosition.x, tmp[i].anchoredPosition.y - tmp[i].sizeDelta.y - shift, 0);
					tmp[i].anchoredPosition = move;
				}
			}
			if(tmp[0]) Destroy(tmp[0].gameObject);
			for(int i = 0; i < tmp.Length; i++)
			{
				if(i < tmp.Length-1) tmp[i] = tmp[i+1];
			}
			tmp[blockCount-1] = block;
		}
		else
		{
			if(clone) Destroy(clone.gameObject);
			clone = block;
		}

	}

	void Update () 
	{
		if(message.Count > 0)
		{
			curTimeout += Time.deltaTime;
			if (curTimeout > timeout) 
			{
				for(int j = 0; j < message.Count; j++)
				{
					if(message[j] != string.Empty)
					{
						AddNewMessage(message[j]);
						message[j] = string.Empty;
						curTimeout = 0;
						return;
					}
				}
				ClearArray();
			}
		}
		else
		{
			curTimeout = timeout;
		}
	}
}

messageBlock - собственно сам блок текста.

blockCount - сколько текстовых блоков одновременно может быть.

timeout - секунды, по истечению которых, на экран добавиться следующее сообщение.

shift - расстояние между блоками.

lifetime - время жизни блока.

moveUp - сдвигать старые сообщения вверх?

message - массив всех сообщений, которые будут показаны, после - массив очистится.

Чтобы отправить сообщения для показа, из какого-нибудь скрипта, пишем в нужном месте:

MessageArray.message.Add("что-то там...");

Кстати говоря, если сделать текстовые блоки с анимацией плавного появления и затухания допустим, получится еще лучше. Но всё это уже украшения, которые каждый придумает в меру своей фантазии и надобности, главное что есть основа.

Скачать проект:

Внимание! Посетители, находящиеся в группе Гости, не могут скачивать файлы.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика