Unity WebGL аварийно завершает работу при отображении диалогового окна JavaScript

Отображение диалогового окна Javascript в браузере из Unity C# приводит к отключению и сбою фотонной сети.

Моя игра Unity WebGL, работающая в браузере, требует, чтобы пользователь ПРОШЕЛ некоторую информацию.

Браузер не позволяет Unity обращаться к прошлому буферу напрямую из Unity, поэтому я написал некоторый код JavaScript для отображения диалогового окна PROMPT, чтобы пользователь мог вставить информацию. Этот код JavaScript вызывается из кода Unity C#.

Проблема в том, что моя игра также использует фотонную сеть, которой постоянно нужно пинговать сервер. Когда мой код C# вызывает код JavaScript и отображается диалоговое окно, движок единства зависает в течение времени, в течение которого отображается диалоговое окно JavaScript PROMPT, это зависание не позволяет фотону пинговать сервер, поэтому, если пользователь занимает более несколько секунд, чтобы выполнить вставку и закрыть диалоговое окно, время ожидания фотона истекает, и он отключается, так как не может пропинговать сервер, и игра вылетает.

Кто-нибудь знает, почему Unity зависает, пока javascript показывает диалоговое окно? есть ли вокруг него?

вот мой код JavaScript

function DoJavaScriptPaste()
{
    var retVal = prompt("Paste Here", "Paste Here");
    if (retVal==null) {
       retVal="";
    }
    var buffer = _malloc(lengthBytesUTF8(retVal) + 1);
    writeStringToMemory(retVal, buffer);
    return buffer;
};

Unity вызывает такой код Javascript из C#

[DllImport("__Internal")]
private static extern string DoJavaScriptPaste();

public void DoPaste()
{
    string pastedInfo=DoJavaScriptPaste();
    text.text = pastedInfo;
 }

Я даже пытался вызвать DoPaste из сопрограммы C#, но Unity Engine все еще зависает...


person Programmer2    schedule 02.05.2019    source источник
comment
Обойти это невозможно. Вам придется использовать пользовательские диалоги.   -  person Tim VN    schedule 02.05.2019
comment
Пользовательские диалоги? вы имеете в виду настраиваемые диалоги Javascript? Как это сделать?   -  person Programmer2    schedule 02.05.2019
comment
Ну стандартные диалоги блокируют исполнение. Я не уверен, что вы можете использовать загрузочную коробку, например, в Unity, так как я не так хорошо знаком с Unity, как с Javascript. bootboxjs.com   -  person Tim VN    schedule 02.05.2019


Ответы (1)


Проблема с подсказками Javascript в том, что они блокируют весь навигатор.

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

Когда подсказка активна, тайм-ауты или обратные вызовы requestanimationframe полностью блокируются.

Как упоминал Тим В.Н., единственным решением было бы создание пользовательских элементов ввода. Вы можете отобразить их над холстом Unity. Или, может быть, вы могли бы использовать что-то вроде модального диалога?

Если вы намеревались приостановить Unity при вводе данных, обязательно добавьте эту строку перед открытием модального окна:

Time.timeScale = 0;
person kevernicus    schedule 02.05.2019
comment
Спасибо за комментарий, движок, останавливающийся во время диалога, является источником проблемы, поэтому я не хочу его останавливать. - person Programmer2; 02.05.2019
comment
Установка timeScale на 0 останавливает продвижение времени в вашей сцене, но ваша сеть по-прежнему будет работать в обычном режиме. Вы заметите, что ваши 2D-интерфейсы также продолжают работать. - person kevernicus; 02.05.2019