从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仍然冻结...
答案 0 :(得分:0)
Javascript提示的问题是它会阻塞整个导航器。
如果我不得不猜测,Unity使用JavaScript超时或requestanimationframe之类的东西来保持Unity的正常运转。
当提示处于活动状态时,超时或requestanimationframe回调将被完全阻止。
如Tim VN所述,唯一的解决方案是创建自定义输入元素。您可以在Unity画布上方显示这些内容。也许您可以使用类似a modal dialog的东西?
如果您打算在输入数据时暂停Unity,请确保在打开模式之前添加以下行:
Time.timeScale = 0;