Войти
ПрограммированиеФорумОбщее

[Unity] Как сделать диалоговое окно, как у Майкрософт?

Advanced: Тема повышенной сложности или важная.

#0
18:12, 20 апр. 2019

Хочу вот такой аналог:

Form form1 = new Form();
...            
if (form1.ShowDialog() == DialogResult.OK)
{
...     
}


#1
20:35, 20 апр. 2019

в Юнити нет таких стандартных окон, нарисуй в GUI окошко и пользуйся

#2
21:01, 20 апр. 2019

Юлий
> в Юнити нет таких стандартных окон, нарисуй в GUI окошко и пользуйся
Уточню, меня интересует не класс Form, а конструкция:

if (form1.ShowDialog() == DialogResult.OK)

Нечто подобное я набросал:

public async Task<bool> ShowDialog()
{
     btnClicked = false;
     while (!btnClicked)
     {
          await Task.Yield();
     }
            
     return dialogResult;
}
А вызывается:
public async void CreateDialog()
{
   Dialog dialog = CreateDialogPrefab();
   if (await dialog.ShowDialog() == true)
   {
       //Делаю что нужно
       dialog.Close();
   }
}

Вот только у Майкрософт сам вызов элегантнее, без async/await.

#3
23:36, 20 апр. 2019

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

#4
0:22, 21 апр. 2019

Intofire
> Нифига не понятно, что и зачем ты хочешь. Перед тем как открывать тему, нужно
> сформулировать задачу и четкий вопрос.
Да мой косяк - думал, что все знают про диалоговые окна.

Form form1 = new Form();
...            
if (form1.ShowDialog() == DialogResult.OK)
{
...     
}
Строчка:
if (form1.ShowDialog() == DialogResult.OK)
означает, что программа прервет свое выполнение и будет ожидать пока не закроется диалоговое окно и только потом выполнится тело условия, ну и далее код.

Мой код:

if (await dialog.ShowDialog() == true)
делает тоже самое, только приходится использовать async/await, а хотелось бы без них т.е.
public void CreateDialog()
{
   Dialog dialog = CreateDialogPrefab();
   if (dialog.ShowDialog() == true)
   {
       //Делаю что нужно
       dialog.Close();
   }
}

#5
18:28, 21 апр. 2019

Может Вам хватит модального окна?

#6
19:03, 21 апр. 2019

seaman
> Может Вам хватит модального окна?
Я не понял вопроса. На Unity таких нет, приходится самому придумывать.

#7
(Правка: 10:26) 10:15, 22 апр. 2019

У Вас может и нет, в Юнити есть.
https://docs.unity3d.com/ScriptReference/GUI.ModalWindow.html

С ГУИ, конечно неудобно работать...
Но в 2019 появилось это.
https://docs.unity3d.com/ScriptReference/UIElements.PopupWindow.html
Не уверен, что это нужное, т.к. не пробовал, не видел.

#8
18:52, 22 апр. 2019

seaman
> У Вас может и нет, в Юнити есть.
> https://docs.unity3d.com/ScriptReference/GUI.ModalWindow.html
Жуть какая-то). Только, если для расширения редактора.

seaman
> Но в 2019 появилось это.
> https://docs.unity3d.com/ScriptReference/UIElements.PopupWindow.html
> Не уверен, что это нужное, т.к. не пробовал, не видел.
Да это же вообще не из той оперы.

#9
21:48, 22 апр. 2019
для расширения редактора

для расширения редактора есть свое окно
Ну, да с ГУИ работать очень неудобно
#10
6:17, 23 апр. 2019

Виндовский ShowDialog для этого запускает внутри собственный цикл обработки сообщений окна. Сомневаюсь, что Юнити даёт доступ к таким вещам. Да и это не кроссплатформенно будет.

#11
12:15, 23 апр. 2019

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

#12
13:03, 23 апр. 2019

В чем суть данной логики - можно поподробнее?

#13
(Правка: 17:32) 17:32, 23 апр. 2019

smartxp
C async/await — логичный и правильный подход. Что бы ты ни придумал на замену, оно будет намного сложнее и страшнее. Разве что юнитевские сопрограммы, но это те же яйца, только некрасивые.

ПрограммированиеФорумОбщее