Unity3D官⽅教程:WebGL(⼀)
Unity3D官⽅教程:WebGL
开始WebGL开发
什么是 Unity WebGL?**
WebGL⼯程选项允许Unity以JavaScript程序形式发布使⽤HTMl5技术和WebGL渲染API、在⽹页浏览器中运⾏的Unity内容。为了构建和测试WebGL内容,在“Build Player”窗⼝中选择WebGL构建⽬标,并且点击“Build & Run ”。
技术概览
为了在WebGL中运⾏,所有代码需要是JavaScript。我们使⽤ emscripten 编译器⼯具链来交叉编译Unity运⾏时代码(⽤C和C++编写)到asm.js的JavaScript代码。asm.js是⼀个⾮常理想的JavaScript⼦集,允许JavaScript引擎 预编译asm.js代码为极具性能的原⽣代码。为了转换.NET 游戏代码(C#和UnityScript脚本)⾄JavaScript,我们使⽤了⼀个称为IL2CPP的技术。IL2CPP获取.NET字节代码并将它转换为对应的C++源⽂件,然后通过使⽤emscripten,这些源⽂件被编译,最终将⽤户的脚本转换为JavaScript。
平台⽀持
Unity WebGL内容在当前⼤部分桌⾯主流浏览器都⽀持,然⽽不同的浏览器,提供的⽀持程度仍有所差别。移动设备并不被Unity WebGL ⽀持。
不是所有Unity特性在WebGL⼯程中都可⽤,⼤部分是因为平台限制的关系,例如:
多线程不被⽀持,因为JavaScript没有线程⽀持技术。这对Unity使⽤多线程来提升执⾏速度,以及脚本代码和管理dll,都产⽣了影响。实际上,所有在System.Threading命名空间中的都不被⽀持。
WebGL⼯程⽆法在MonoDevelop或Visal Studio中进⾏调试。详细请看“Debugging and trouble shooting WebGL builds”(暂未译出)。
浏览器不允许联⽹进⾏IP套接字的直接存取,出于安全⽅⾯得考虑。详细请看“WebGL Networking”(暂未译出)。
WebGl图形API等同于OpenGL ES 2.0,有⼀些限制,详细请看:“ WebGL Graphics”(暂未译出)。
WebGL⼯程使⽤⼀个⾃定义、基于Web Audio API的后端,⽤于⾳效。这仅⽀持基本的⾳频功能。详细请看“Using Audio in WebGL”(暂未译出)。
WebGL是⼀个预编译平台,所以它不允许使⽤System.Reflection.Emit的代码动态⽣成。这在所有其它IL2CPP平台,iOS,以及⼤部分控制台都⼀样。
WebGL 浏览器兼容性
Unity WebGL在⼀定程度上⽀持所有的桌⾯主流浏览器。然⽽,不同的浏览器之间,⽀持程度、预期性能并不⼀样。请通过以下的表格,对Unity WebGL特性,以及哪些浏览器⽀持它们做⼀个整体查看。
注意,Unity WebGL 内容⽬前在移动设备上不⽀持。它或许在⾼档设备仍可以⼯作,但许多现有的设备并不⾜够强⼤,且没有⾜够的内存空间来很好地⽀持Unity WebGL内容。出于这个原因,当尝试在移动设备的浏览器上加载内容时,Unity WebGL会显⽰⼀个警告信息(如果需要,此功能可以被关闭)。
注意到,这个兼容表针对浏览器特定版本才有意义。更⾼版本会继续⽀持,但先前的版本可能会不稳定。
Mozilla Firefox 42Google
Chrome
46
Apple Safari 9.0
MS
Internet
Explorer
11
MS Edge 13
WebGL⽀持是。GPU⿊名单可
⽤。WebGL可能不被
⼀些特定的⽼显卡所
⽀持。
是。GPU
⿊名单可
⽤。
WebGL可
能不被⼀些
特定的⽼显
卡所⽀持。
是。需要Safari8以及更⾼版本。
是。需要
IE11及
更⾼版
本。
是
⽹页⾳效。⽹页⾳效API被
⽹页⾳效。⽹页⾳效API被
⽤于在Unity WebGL内容
中播放声⾳。
是是是否是
全屏是是否。Safari supports the HTML5 full-screen API,
but no keyboard input when in full-screen
mode, so Unity will disable full-screen
functionality when running in Safari.Safari⽀持
HTML5全屏API,但在全屏模式下没有键盘输⼊。所
以在Safari中运⾏时,Unity将关闭全屏功能。
是是
游标锁定是是否否是。需要
Edge13及更⾼版本。
⼿柄是是否否是
本地索引数据库是。⽕狐直到42版、
以及Safari不⽀持⽤
于在⼀个iFrame中运
⾏内容的索引数据
库。⽕狐43及以后的
版本会修复此⽀持。
是
是。⽕狐直到42版、以及Safari不⽀持⽤于在⼀个
iFrame中运⾏内容的索引数据库。⽕狐43及以后的版
本会修复此⽀持。
是是
⽹络套接字是是是是是⽹络实时通信是是否否是
WebGL2.0否。⽕狐⽀持
WebGL2.0,但默认
不可⽤,并且需要在
about:config中开
启。
否否否
否。Chrome⽀
持WebGL2.0,
但默认不可⽤,
并且需要在
chrome://flags
中开启。
asm.js预编译。asm.js是浏
览器可以针对性优化的
JavaScript⼦集。由于
Unity使⽤asm.js,所以实
现了asm.js⽀持的浏览器能
够更快地运⾏Unity
WebGL。
是否否否是
注意
Chrome可能需要⼤量的内存来解析⽣成的JavaScript代码,可能在32位浏览器重加载内容时,引起内存溢出或崩溃错误。查
看“Memory Considerations”(暂未译出)获得更多关于内存使⽤的信息。
Internet Explorer 不⽀持⾳效,并且太缓慢⽽⽆法像样地⽀持⼤部分Unity WebGL内容。出于这个原因,当在IE中打开内容时,我们将展⽰⼀个关于使⽤不⽀持的浏览器的警告信息。在表格中列举IE只是为了完整性;应当建议IE使⽤者升级到微软新的Edge浏览器。
构建并运⾏⼀个WebGL项⽬
当你构建⼀个WebGL项⽬时,Unity⽤以下⽂件创建了⼀个⽂件夹:
⼀个index.html⽂件,浏览器可以使⽤它导航读取到你的内容。
⼀个开发或发⾏⽂件夹装有你⽣成的⼯程输出⽂件(是哪个⽂件夹,依赖于你是否进⾏开发)
⼀个模板数据⽂件夹(⾄少在使⽤默认模板时会有),装有加载条和其它模板资源。查看“WebGL 模板”(暂未译出)的⽤户⼿册页⾯,来获取更多信息。
开发/发⾏ ⽂件夹包含了以下⽂件(“MyProject”⽂件名称代表你项⽬的名称)。(注意,如果你⽣成⼀个发⾏版⼯程,这个⽂件夹⾥的⽂件会诶压缩并有⼀个.gz的后缀。查看下⾯分发尺⼨的注释。)
MyProject.js这个JavaScript ⽂件包含了你播放器的代码。
<⽂件包含了⼀个初始化你播放器堆内存的⼆进制图像。
MyProject.data⽂件包含了资源数据和场景。
UnityLoader.js⽂件包含了需要⽤于在⽹页中加载Unity内容的代码。
你可以通过⽤⼤部分浏览器打开index.html⽂件,直接查看你的WebGL 播放器。然⽽,出于安全的原因,Chrome在从本地⽂件URL中打开的脚本上做了限制,所以这个技术在Chrome中⽆法使⽤。为了绕过Chrome的限制,使⽤Unity的Build&Run命令(File-
>Build&Run);这个⽂件就暂时在⼀个本地⽹页服务器中,并且是从⼀个本地宿主URL中打开。或者,可以⽤ –disable-web-security 命令⾏选项来运⾏Chrome,这允许Chrome从本地⽂件的URL加载内容。
在⼀些服务器上,⽤户需要⽣成可读取的.mem和.data⽂件,因为服务器需要提供这些⽂件给⽤户。
构建播放器选项
(菜单:File->Build Settings…)进⼊WebGL选项对话框。在对话框中,从平台列表中选择WebGL,然后选择播放器选项…
开发⼯程
当你选中Development Build 勾选框,Unity⽣成⼀个开发⼯程,有事件探查器⽀持喝⼀个开发控制台来查看错误。另外,开发⼯程不压缩内容(即,内容不是最⼩化的);维持在在可以⼈⼯阅读的JavaScript形式,保留了函数名,这样⽤户得到有⽤的错误追踪栈。注意,这意味着开发⼯程会⾮常⼤,太⼤⽽⽆法发布。
使⽤预构建引擎
这个选项仅在⽤户勾选了开发⼯程时出现。在⼯程选项对话框中使⽤“Use pre-build Engine”选项来在开发期间加速构建迭代时间。当此选项被启⽤时,Unity仅重构建”manager code”,动态链接到预编译Unity引擎,这样项⽬的重构建⼤概会0%⾄40%。注意,这种构建类型仅适合于开发⽬的,因为总是产⽣”unstripped”引擎代码。此外,由于动态链接,这种⼯程的类型⽐普通类型的执⾏上更慢。
⾃动连接探查器
此选项仅当⽤户勾选了开发⼯程时可⽤。勾选⾃动连接探查器选项,让⽤户探查Unity WebGL内容。对于WebGL,它不可能连接到事件探查器来运⾏⼯程像在其它平台上那样,所以⽤户需要使⽤这个选项来连接内容到编辑器。这是因为事件探查器连接通过使⽤WebGL的WebSockets被掌控,单⼀个⽹页浏览器仅允许内容的向外连接。
播放器设置
WebGL在播放器设置的检视器窗⼝(菜单:Edit->Project Settings ->Player)中,有⼀些另外的选项。
其它选项 Other Settings
精简引擎代码
打开 Other Settings 来选择 Strip Engine Code选项。这个选项默认被选中,来允许代码为WebGL所精简。随着这个选项被选中,Unity 不包括任何你不使⽤的类的代码。例如,如果你不使⽤任何物理组件或功能,那么整个物理引擎会被从你的⼯程中移除。查看下⽅的精简区来获得更多细节。
发布选项
WebGL内存⼤⼩
打开Publishing Settings进⼊WebGL 内存⼤⼩区域。这⾥,你可以指定内容应为它的堆分配多少内存(以MB为单位)。如果这个值太低,⽤户会收到“内存溢出”错误。这意味着要加载的内容喝场景⽆法完整放⼊可⽤的内存中。然⽽如果这个值太⾼,内容可能⽆法加载到⼀些浏览器或⼀些机器⾥,因为浏览器可能没有⾜够的可⽤内存来分配要求的堆尺⼨。这个值被写到在⽣成的 .html ⽂件⾥⼀个名为TOTAL_MEMORY的变量中,所以如果⽤户希望尝试这个值,可以编辑 .html ⽂件来避免重构你的项⽬。查看在 WebGL memory usage 中的 User Manual 页⾯来获取更多细节。
启⽤异常
打开发布设置来进⼊ Enable Exceptions(启⽤异常) 。启⽤异常允许⽤户指定在运⾏时意外的代码⾏为(通常被认为是错误)如何被处理。这⾥有三个选项:
None ⽆:选择这个如果你不需要任何异常⽀持。这提供了最佳的性能和最⼩的构建。使⽤这个选项,任何异常的抛出都引起你内容停⽌。
Explicitly Thrown Exceptions Only 仅抛出明确异常(默认):选择此项来捕获,在⽤户脚本中抛出状态明确指定的异常。此选项也会让脚本中最终的阻塞产⽣作⽤。注意,选择此选项,会让从⽤户脚本所⽣成的JavaScript代码变得更⼤及更缓慢,但,除⾮脚本是你项⽬主要的瓶颈,这并不是⼤问题。
Full 完整:选择这个选项来捕获:
在⽤户脚本中抛出状态明确指定的异常
空引⽤
数组越界读写
托管栈跟踪
Unity通过在代码中嵌⼊检查,为它们⽣成这些异常;因此这些选项增⼤了代码尺⼨并且降低了性能。仅在需要调试时,在代码中使⽤这个模式,因为它构建了⾮常庞⼤且⾮常缓慢的⼯程。
选择Publishing Settings(发布设置)来进⼊Data Caching(数据缓存)。选择此项来开启播放器数据的⾃动本地缓存。这个选项设置资源在浏览器的索引型数据库中,作为本地的缓存⽽存储;这样在内容的后续运⾏时,资源不会被再次下载。注意,不同的浏览器在允许索引型数据库存储时,有不同的规则;浏览器可能询问⽤户来允许存储数据,并且⼯程可能超出被浏览器定义的尺⼨限制。
发⾏⼤⼩
当向WebGL平台发布时,保证⼯程的⼤⼩尽可能低,让⽤户在内容开始前,只经历可忍受的下载时长。关于降低资源尺⼨的通⽤技巧,请阅读Reducing the file size of the build。
对于WebGL的专有提⽰
对在纹理导⼊器中所有压缩的纹理,指定Crunch纹理压缩格式。
不要部署开发⼯程;这些未被压缩,或不是最⼩化,所以有很⼤的⽂件尺⼨。
到播放器设置中(菜单:Edit->Project Settings ->Player),打开Publishing Settings并设置Enable Exceptions为None,如果你不需要在⼯程中抛出异常。
到播放器设置中(菜单:Edit->Project Settings ->Player),打开Other Settings 并且启⽤Strip Engine Code来保证产⽣⾼效的⼯程。
当使⽤第三⽅dlls时要⼩⼼,因为它们可能包含⼤量的依赖,并且因此明显增⼤了⽣成代码的⼤⼩。
如果要⽣成⼀个发⾏版⼯程,Unity根据在WebGL PlayerSetings->Publishing Settings窗⼝中选择的Compression Format(压缩格式),来压缩⼯程输出⽂件。
查看Deploying compressed builds中的⽂档,来获取更多这些选项的信息,以及如何⽤这些选项来发布⼯程。
资源包
因为所有资源数据需要在内容之前预先下载,所以你应当考虑从你的主数据⽂件中移除资源,放⼊资源包中。⽤这种⽅式,你可以为你的内容创建⼀个能迅速读取的,⼩的加载场景。资源包也有助于资源数据内存管理:你可以通过调⽤AssetBundle.Unload,从内存中卸载你不再需要的资源数据。
⼀些在WebGL平台上使⽤资源包时需要考虑的事情:
当你在资源包中使⽤在你主⼯程中没⽤到的类类型,Unity会对这些类从⼯程中精简掉这些代码。当尝试从资源包中加载资源时,这可能引发错误。查看在下⽅ Stripping 中的部分,来学习如何修复这个问题。unity 教程
WebGL不⽀持多线程,但http下载仅在它们结束下载时可⽤。由于这个原因,当下载完成时,Unity WebGL⼯程需要在主线程中解压资源数据,阻塞了主线程。为了避免这⼀中断,对于在WebGL上的资源包,LZMA AssetBundle compression是不可⽤的。资源包换成⽤
LZ4来压缩,在解压缩时⾮常迅速。如果你需要⽐LZ4更⼩的压缩尺⼨,你可以配置你的⽹页服务器对你的资源包使⽤gzip或者Brotli压缩(⽐LZ4压缩更⼩)。查看Deploying compressed builds中的⽂档来获取如何进⾏压缩的更多信息。
通过使⽤浏览器的索引型数据库API,来实现:在WebGL中使⽤ WWW.LoadFromCacheOrDownload 以⽀持资源包在⽤户的电脑上缓存。注意,索引型数据库可能在某些浏览器上⽀持有限,且这些浏览器可能要求⽤户提供在磁盘上存储数据的权限。查看 WebGL browser compatibility 中的⽂档来获取更多信息。
Stripping 精简
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论