如何在更改页面时清理和卸载Unity WebGL画布

4

在下载和运行Unity WebGL游戏后,我在改变当前页面时遇到了网页应用程序的问题。

实际上,我可以确定游戏正在运行,因为当我的角色死亡时,我不断听到声音。

在改变网页时是否有一种删除所有内容的方法?这可能是一种内存泄漏吗?

编辑1:我的网页应用程序使用AngularJS / Material完成。


这肯定是Unity的bug。不过,你可以创建一个浏览器脚本来强制卸载所有已加载的内容。 - Nika Kasradze
问题是我不知道Unity加载了什么。我怎样才能在不卸载自己的脚本的情况下做到这一点? - MadJlzz
1
Unity会生成5-10个文件,例如YourBuildName.data、YourBuildName.html.mem、YourBuildName.js等。请卸载它们(这些文件可能在ReleaseDebug文件夹中,具体取决于构建方式)。 - Nika Kasradze
你所说的卸载它们是什么意思?在index.html文件中,我清楚地看到一个Unity脚本正在加载这些文件,但我没有任何方式告诉Unity卸载这些文件。 - MadJlzz
@NikaKasradze:JavaScript没有直接删除非平凡资源的方法。一旦某个东西被加载,通常会保持这种状态。 - Krzysztof Bociurko
我只是在 JavaScript 中过于追求细节。 - Nika Kasradze
2个回答

4
解决方案很简单:在一个iframe中加载WebGL unity,这样就能将应用程序沙盒化。
完成unity应用程序后,只需删除iframe节点即可,例如:
var iframe=...;
iframe.parentNode.removeChild(iframe);

当你在iframe中时,无法直接与Unity播放器通信,但是你仍然可以通过postMessage互相传递消息。

此外,应立即卸载所有与之相关的资源。


谢谢你的回答。你的解决方案看起来非常不错,很有趣,但是一旦我把我的Unity WebGL放在iframe中,它甚至都不会寻找加载资源... - MadJlzz
这不应该发生,你能提供更多信息吗?例如Web开发控制台日志、带有问题的在线演示等。 - Krzysztof Bociurko
嗯,我回答得太快了。事实上,使用Unity构建游戏时生成的原始index.html文件就可以工作(而且数据会在不进行任何处理的情况下卸载)。 问题是我试图直接通过iframe传递AngularJS值。我认为我没有其他解决方案,只能使用老派的GET方法。或者,是否有可能使用postMessage来传递AngularJS数据? - MadJlzz
1
这是可能的,但如果您计划仅在初始化时传递此数据,则最好的方法是使用URL的哈希部分(即#字符后面的部分,例如:http://example.com/path?search#hash)。这样它甚至不会被发送到服务器,同时仍然可以通过JavaScript中的location.hash使用。 - Krzysztof Bociurko
不确定您的意思,是指 postMessage 部分需要澄清吗? - Krzysztof Bociurko
显示剩余5条评论

3

Unity 2019.1提供了一个恰当的方法来退出webgl并释放内存(尽管在我的测试中失败了,也许是我错了,请让我知道它是否真正有效):

  • C#:调用Application.Quit()
  • JS:调用unityInstance.Quit(callback)

您可以像这样使用JS版本

unityInstance.Quit(function() {
    console.log("done!");
});

更多内容请查看退出和内存清理


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接