1 Вопрос: Unity WebGL падает, когда отображается диалоговое окно JavaScript

вопрос создан в Thu, May 2, 2019 12:00 AM

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

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

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

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

Кто-нибудь знает, почему 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 по-прежнему зависал ...

    
0
  1. Обойти это невозможно. Вам придется использовать пользовательские диалоги.
    2019-05-02 15: 15: 43Z
  2. Пользовательские диалоги? Вы имеете в виду пользовательские диалоги Javascript? Как это сделать?
    2019-05-02 15: 38: 43Z
  3. Ну, стандартные диалоги блокируют выполнение. Я не уверен, что вы можете использовать bootbox, например, в Unity, так как я не настолько знаком с Unity, как с Javascript. bootboxjs.com
    2019-05-02 16: 27: 06Z
1 ответ                              1                         

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

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

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

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

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

Time.timeScale = 0;
    
0
2019-05-02 15: 40: 21Z
  1. Спасибо за комментарий, причиной проблемы является остановка движка во время диалога, поэтому я не хочу останавливать его
    2019-05-02 15: 45: 38Z
  2. Установка значения timeScale на 0 останавливает продвижение времени в вашей сцене, но ваша сеть все равно будет продолжать работать в обычном режиме. Вы заметите, что ваши 2D-интерфейсы также продолжают работать.
    2019-05-02 15: 49: 22Z
источник размещен Вот