Как сделать всплывающее окно в unity
Перейти к содержимому

Как сделать всплывающее окно в unity

  • автор:

Unity 3D всплывающее окно

Всем привет. Такой вопрос, есть карта, на ней стоят здания (штук 8). Как сделать так, что при приближении камеры к любому из зданий, на экран всплывает окошко с описанием именно про это здание. Причем что бы окошко можно было закрыть. Заранее, спасибо.

Голосование за лучший ответ

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

СЕРДЦА.NETМастер (1667) 8 лет назад
нету такого скрипта, что при столкновении с объектом появляется окошко?

Андванс Чесс Просветленный (31776) У меня нет, а в чём проблема написать? По идее столкновение очень легко детектируется, разве нет?

Всплывающая подсказка [Tooltip]

Всплывающая подсказка для Unity, которая может показывать какой-нибудь текст, если курсор наводится на UI объект, или другой объект с коллайдером и скриптом, содержащим текст подсказки. Делать Tooltip с фиксированной позицией и размерами, мы не станем, так как это достаточно просто. Наш вариант будет привязан к позиции курсора, в рамках конкретного объекта. Кроме всего прочего, визуально это будет не только текст с фоном, к этой конструкции приделаем еще и стрелку, позиция которой относительно фона, будет рассчитываться с учетом расположения в нижней или верхней части. Размер Tooltip-а по ширине имеет ограничения, а вот высота регулируется в зависимости от длины текста.

Сделаем шаблон. Добавляем на сцену Canvas и удаляем компонент Graphic Raycaster, так как нам не нужно взаимодействие курсора с Tooltip-ом. Теперь в Canvas добавим изображение для фона, назем его Box, просто обычный квадрат. Добавим стрелку Arrow, это спрайт треугольника, который по умолчанию повернут так, чтобы указывать вниз. Добавим текстовый UI под именем Text.

Делаем Text и Arrow — дочерними Box.

Устанавливаем пресеты Rect Transform.

Для Box и Arrow:

Всплывающая подсказка [Tooltip]

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

using UnityEngine; using UnityEngine.UI; using System.Collections; public class Tooltip : MonoBehaviour < public static string text; public static bool isUI; public Color BGColor = Color.white; public Color textColor = Color.black; public enum ProjectMode ; public ProjectMode tooltipMode = ProjectMode.Tooltip3D; public int fontSize = 14; // размер шрифта public int maxWidth = 250; // максимальная ширина Tooltip public int border = 10; // ширина обводки public RectTransform box; public RectTransform arrow; public Text boxText; public Camera _camera; public float speed = 10; // скорость плавного затухания и проявления private Image[] img; private Color BGColorFade; private Color textColorFade; void Awake() < img = new Image[2]; img[0] = box.GetComponent(); img[1] = arrow.GetComponent(); box.sizeDelta = new Vector2(maxWidth, box.sizeDelta.y); BGColorFade = BGColor; BGColorFade.a = 0; textColorFade = textColor; textColorFade.a = 0; isUI = false; foreach(Image bg in img) < bg.color = BGColorFade; >boxText.color = textColorFade; boxText.alignment = TextAnchor.MiddleCenter; > void LateUpdate() < bool show = false; boxText.fontSize = fontSize; if(tooltipMode == ProjectMode.Tooltip3D) < RaycastHit hit; Ray ray = _camera.ScreenPointToRay(Input.mousePosition); if(Physics.Raycast(ray, out hit)) < if(hit.transform.GetComponent()) < text = hit.transform.GetComponent().text; show = true; > > > else < RaycastHit2D hit = Physics2D.Raycast(_camera.ScreenToWorldPoint(Input.mousePosition), Vector2.zero); if(hit.transform != null) < if(hit.transform.GetComponent()) < text = hit.transform.GetComponent().text; show = true; > > > boxText.text = text; float width = maxWidth; if(boxText.preferredWidth Screen.height) // если Tooltip выходит за рамки экрана, в данном случаи по высоте < curY = Input.mousePosition.y - box.sizeDelta.y / 2 - arrow.sizeDelta.y; arrowPositionY = box.sizeDelta.y + (arrow.sizeDelta.y / 2 - 1); arrowScale = new Vector3(1, -1, 1); // отражение по вертикале >float curX = Input.mousePosition.x + arrowShift; if(curX + box.sizeDelta.x / 2 > Screen.width) < curX = Input.mousePosition.x - arrowShift; arrowPositionX = width - arrowShift; >box.anchoredPosition = new Vector2(curX, curY); arrow.anchoredPosition = new Vector2(arrowPositionX, arrowPositionY); arrow.localScale = arrowScale; foreach(Image bg in img) < bg.color = Color.Lerp(bg.color, BGColor, speed * Time.deltaTime); >boxText.color = Color.Lerp(boxText.color, textColor, speed * Time.deltaTime); > else < foreach(Image bg in img) < bg.color = Color.Lerp(bg.color, BGColorFade, speed * Time.deltaTime); >boxText.color = Color.Lerp(boxText.color, textColorFade, speed * Time.deltaTime); > > >

Чтобы получать текстовую информацию с 3D или 2D, игровых объектов у которых есть свой коллайдер, на них нужно повесить скрипт TooltipText с соответствующем текстом подсказки:

using UnityEngine; using System.Collections; public class TooltipText : MonoBehaviour

Чтобы получать текст с UI объектов, вне зависимости от выбранного режима tooltipMode, на них нужно цеплять скрипт TooltipTextUI с несколько другим кодом, чем для обычных объектов:

using UnityEngine; using UnityEngine.EventSystems; using System.Collections; public class TooltipTextUI : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler < public string text; void IPointerEnterHandler.OnPointerEnter(PointerEventData e) < Tooltip.text = text; Tooltip.isUI = true; >void IPointerExitHandler.OnPointerExit(PointerEventData e) < Tooltip.isUI = false; >>

Собственно, как-то так.

Unity3D(C#) — Как сделать всплывающие окна?

Как можно сделать всплывающие окна? Например, дойдя до конца уровня, игра должна остановится, и в центре должно всплыть окно, мол: » Вы завершили уровень ‘1’ » и далее переход на другую сцену. Я искал в интернете информацию, но так и не получилось это реализовать. За ранее спасибо!

  • Вопрос задан более трёх лет назад
  • 4593 просмотра

Комментировать
Решения вопроса 2

BasmanovDaniil

Даниил Басманов @BasmanovDaniil
Геймдизайнер-телепат

Как делать само окно смотрите в туториалах. Конкретная реализация остановки игры зависит от вашей архитектуры, самый простой вариант — выставить Time.timeScale в ноль. Перейти на другую сцену можно с помощью SceneManager.LoadScene.

Ответ написан более трёх лет назад
Нравится 3 1 комментарий
NickName7331 @NickName7331 Автор вопроса
Разработчик Unity C#

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

Короче, ставишь какой либо объект, пустой или куб, это не важно, выключаешь MeshRender, создаешь колайдер если его нет, делаешь его тригерным и проверяешь, если персонаж прошел через колайдер значит ставишь игру на паузу с помощью Time.timeScale = 0 или 1; 0 — это полная пауза, 1 — нормальная скорость(оно же выход из паузы).
После пересечения можно Флаг, true, false.
Если True — включаешь Canvas с Текстом где написано мол «Ты красавчик бартишка, ты прошел уровень, теперь твоя жизнь имеет смысл.))))»

Надеюсь понятно объяснил

Ответ написан более трёх лет назад
Нравится 3 3 комментария
NickName7331 @NickName7331 Автор вопроса
Спасибо. Но есть вопрос: как проверить, вошел ли персонаж(Character) в коллайдер

NickName7331, Так создай функцию OnTriggerEnter(Collider colider) в скрипте колайдера и там проверяй, кто вошёл в данный объект.

Как сделать pop-up в Unity?

В игровой сцене есть менюшка с клавишами (GameObject → UI → Button). Я хочу, что бы при нажатии на клавишу «About» появлялся pop-up (всплывающее окно) с информацией о игре. Как это сделать?

Отслеживать
задан 5 янв 2018 в 12:38
298 1 1 серебряный знак 12 12 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Вариантов много. Старайтесь выделять в вопросе главную проблему.

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

Только учтите, что такая панель должна лежать выше остального UI, чтобы блокировать все клики. Прикольнее, когда панель не полностью прозрачная, а имеет затемнение (так пользователям видно, что остальной UI заблокирован).

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

Отслеживать
ответ дан 11 янв 2018 в 8:27
423 4 4 серебряных знака 17 17 бронзовых знаков

Спасибо, я просто де/активирую объект. Но это не то, я думал можно сделать что бы появлялось новое окошно как в компютерных OS. Сейчас хочу разобраться, как сделать что бы объект выезжал при активации и уезжал назад при деактивации.

16 янв 2018 в 9:27

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *