显示JavaScript对话框时Unity WebGL崩溃

时间:2019-05-02 14:58:58

标签: javascript c# unity3d unity-webgl

从Unity C#在浏览器中显示Javascript对话框会导致光子网络断开连接并崩溃。

我在浏览器中运行的Unity WebGL游戏需要用户通过PAST输入一些信息。

浏览器不允许Unity直接从Unity访问过去的缓冲区,因此我编写了一些JavaScript代码来显示PROMPT对话框,以便用户可以粘贴信息。从Unity C#代码中调用此JavaScript代码。

问题在于我的游戏还使用了光子网络,该网络需要不断ping服务器。当我的C#代码调用JavaScript代码并显示对话框时,在显示“ JavaScript PROMPT”对话框期间,统一引擎冻结,这种冻结会阻止光子对服务器执行ping操作,因此,如果用户花费了超过几秒钟完成粘贴并关闭对话框,光子超时并断开连接,因为它无法ping通服务器,并且游戏崩溃。

有人知道为什么当JavaScript显示对话框时Unity冻结吗?反正周围吗?

这是我的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从C#调用Javascript代码

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

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

我什至尝试从C#协程调用DoPaste,但是Unity Engine仍然冻结...

1 个答案:

答案 0 :(得分:0)

Javascript提示的问题是它会阻塞整个导航器。

如果我不得不猜测,Unity使用JavaScript超时或requestanimationframe之类的东西来保持Unity的正常运转。

当提示处于活动状态时,超时或requestanimationframe回调将被完全阻止。

如Tim VN所述,唯一的解决方案是创建自定义输入元素。您可以在Unity画布上方显示这些内容。也许您可以使用类似a modal dialog的东西?

如果您打算在输入数据时暂停Unity,请确保在打开模式之前添加以下行:

Time.timeScale = 0;