Найти тему
IT-предприниматель

Мультиплатформенные Toast в Unity 2020

Оглавление

Доброго времени суток, дорогой читатель. Так как я сейчас занимаюсь разработкой своей игры в Unity, то периодически сталкиваюсь с различными задачами и о некоторых буду рассказывать в своём блоге.

Сегодня речь пойдет о Toast уведомлениях, какие бывают в Android (не уверен насчет iOS, но там точно есть что-то похожее). Такие уведомления пригодятся, когда вам нужно показать важную информацию пользователю, которая не требует подтверждения.

Пример Toast сообщения
Пример Toast сообщения

Я долго пытался найти решение в интернете, но не один из текстовых источников не дал мне его. Есть assets в магазине плагинов, но чаще всего они платные, да и помимо этого добавляют кучу всего ненужного в проект.

Что такое Toast?

Toast представляет из себя текстовое сообщение на слегка прозрачном фоне (стилизировать такие сообщения можно на свой вкус и цвет, я буду рассматривать классический вариант), которые появляются на несколько секунд и исчезают, не требуя от пользователя никаких действий для этого.

Изначально показалось, что можно взять какой-нибудь UI элемент вроде Button и стилизировать его, не включая обработчик нажатия. Но основная проблема с которой я столкнулся, что такой вариант не будет масштабироваться в зависимости от количества текста и что-то может быть обрезано.

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

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

О том, как я использовал информацию из него я и расскажу далее, в применении к своему решению задачи создания именно Toast-сообщений.

Структура префаба

Я буду опускать совсем базовые вещи в Unity, будем считать, что вы знаете, что такое префабы (prefabs), компоненты и как их создавать и добавлять.

Создадим префаб со следующей структурой, элементы создаются нажатием на правую кнопку мыши и выбором соответствующие пунктов (указаны на скриншоте):

Структура префаба
Структура префаба

Первый элемент - Empty Object, внутри него Image, и уже внутри Text.

ToastContainer

В ToastContainer добавляем два компонента — Vertical Layout Group и Content Size Fitter:

И настраиваем их следующим образом, Vertical Layout Group:

Настройки Vertical Layout Group
Настройки Vertical Layout Group

И Content Size Fitter:

Настройки Content Size Fitter
Настройки Content Size Fitter

Стоит обратить внимание на компонент Rect Transform, задать здесь максимальную ширину (250 в моем случае) нашего всплывающего сообщения. А в Anchor Presets прижать элемент к нижней границе по центру и немного приподнять от низа:

Anchor Presets
Anchor Presets

Тут же в графе Pivot в поле Y нужно установить значение 0, чтобы при увеличении количества строк в нашем Toast он рос вверх, а не вниз за пределы экран

ToastBackground

В ToastBackground добавляем Vertical Layout Group и Layout Element:

Настраиваем Vertical Layout Group, задавать отступы (padding) не обязательно, но по моему так выглядит красивее:

Настройки Vertical Layout Group
Настройки Vertical Layout Group

В Layout Element задаем минимальные размеры ширины и высоты, можете взять мои за основу, а потом выбрать те, что вам более подходят:

Настройки Layout Element
Настройки Layout Element

В компоненте Image этого элемента задаем фон, можно создать своё изображение, а можно выбрать из стандартных, например, которое используется для полей ввода и просто задать ему нужный цвет фона, как я и сделал, вот как выглядят настройки:

Настройки компонента Image
Настройки компонента Image

Text

Единственное, что нужно настроить для этого элемента — шрифт, текст, его местоположение (например, по центру), цвет и т.д.

И вот что должно получиться в результате, если нет, то какие-то из настроек вы пропустили или указали неправильно:

Результат масштабирования Toast
Результат масштабирования Toast

Код класса

После того, как у нас готов prefab для нашего будущего сообщения, нам остается написать код, который будет вызывать создание префаба, добавление его в сцену и удаление спустя нужное время. Я реализовал это в виде отдельного класса:

using System;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.Scripts.Utils.Messages
{
class Toast
{
private String Message;
private int Seconds;
private GameObject GameObject;
public Toast(string message, int seconds)
{
Message = message;
Seconds = seconds;
}
public void Show(Canvas canvas)
{
GameObject = UnityEngine.Object.Instantiate(Resources.Load("Prefabs/ToastContainer"), canvas.transform) as GameObject;
GameObject text = GameObject.transform.Find("ToastBackground").Find("Text").gameObject;
text.GetComponent<Text>().text = Message;
VoidTask();
}
private async void VoidTask()
{
await Task.Delay(TimeSpan.FromSeconds(Seconds));
UnityEngine.Object.Destroy(GameObject);
}
}
}

А вызвать отображение сообщения можно кодом:

new Toast("End skips", 1).Show(HUDCanvas);

В качестве параметра методу Show нужно передать Сanvas интерфейса, чтобы он знал, куда добавлять сообщение. В конструкторе можно задать текст сообщения и время в секундах, сколько нужно подождать перед удалением объекта.

Заключение

Таким, довольно простым способом можно создать мультиплатформенные Toast уведомления, вопрос уместности их в iOS или на других платформах остается открытым. Используются стандартные инструменты Unity, никаких проблем не наблюдал на разных платформах.

Вы можете сделать собственный дизайн сообщениям, добавить плавную анимацию исчезновения и много ещё чего на своё усмотрение. Оставляю вам простор для воображения.

Пишите свои комментарии — понравилась ли статья и нужно ли продолжать делать такие выкладки по Unity, ставьте лайки, подписывайтесь на группу вконтакте, подписывайтесь на этот блог, постараюсь радовать вас новыми статьями. Всем желаю получить награду за старание и рвение в жизни и на работе.