网站域名备案多长时间,做电子章网站,免费的素材库图片,教育网站建设的目的转自:https://www.cnblogs.com/yaukey/p/unity_webgl_explore_1.html
查找了 Unity 的官方资料#xff0c;我们如果需要使用 WebGL 需要面对以下几个挑战#xff1a;
Native Plugin#xff1a;也就是说各种原生插件#xff08;C/C等编译的本地机器码库#xff09;#…转自:https://www.cnblogs.com/yaukey/p/unity_webgl_explore_1.html
查找了 Unity 的官方资料我们如果需要使用 WebGL 需要面对以下几个挑战
Native Plugin也就是说各种原生插件C/C等编译的本地机器码库我们的挑战是使用了 SLua。多线程WebGL 端无法支持任何多线程代码因为 JavaScript 没有多线程的实现C# 端使用的类似 System.Threading 等库最终都不会被编译成相应的 js 代码。网络模块传统的 Socket 无法使用必须使用 WebSocket 或者 xxxSystem.Net尤其是 UnityEngine.Net.Sockets 都未在 WebGL 端实现所以将无法被正确编译转换Unity 中可以使用 WWW 和 UnityWebRequest或者使用新版支持 WebGL 的 Unity Networking API或者直接在 JavaScript 中使用 WebSockets 和 WebRTC 来实现网络层功能。渲染WebGL 的图形 api 是基于 OpenGL ES 2.0GI 只支持 Baked GI我们没使用Procedural Materials 不支持我们没使用Linear Rendering 不支持我们没使用MovieTextures 不支持我们没使用WebGL Shader code restrictions目前理解为在 shader 代码中只支持使用常量循环的索引值或者联合体来作为访问数组和矩阵的索引唯一的例外是在 Vertex Shader 中访问 uniform 时可以使用任意的表达式另外还有循环的限制不可以使用 “计数循环-初始化一个变量时赋给一个常量值每次循环时增加或减少一个常量值” 以外的方式并且不支持 while 循环。目前大致看来我们没有使用数组或矩阵的下标表达式也没有使用复杂的循环后期可能还需要仔细排查。Audio 有几乎一大半的 api 不支持后面需要做兼容修改应该不少麻烦。其它暂不考虑以上几项直接决定我们是否可以先 Port 出来效率问题都先不考虑。 先从 Native Plugin 入手Lua 这是需要迈过的第一道坎儿。官方给了两个很好的文档WebGL: Interacting with browser scripting 和 Unity WebGL中的底层插件WebGL 是通过 IL2CPP 将所有的 C# 代码转换成 C这样便可以使用基于 LLVM 的 Emscripten 的工具链将所有的 C 代码编译成基于 asm.js 的 JavaScript 代码这样便可以在支持 Html5 的浏览器上运行。 我们使用了 SLua 插件所以我现在需要使用 Lua 的源代码来参与编译和打包过程即可。很庆幸我们项目在今年大家开会讨论后决定从原来的 LuaJit 升级为 Lua 5.3如果是 LuaJit 项目本身的编译产生了大量针对目标平台的汇编代码来最终生成的具有极大的平台特异性所以就算是使用 LuaJit 的源码也是无法使用 WebGL 的依然需要直接使用 Lua 5.1 或者 5.3 的源码。 新建一个空的 Unity 工程导入 SLua 插件切换到 WebGL 平台在 Plugins 中新建文件夹 WebGL新建一个 C 代码文件比如lua.dll.c然后将最新版 Lua5.3 源码解压到本地的一个目录(LuaSrcDir)所有代码都在(LuaSrcDir)所有代码都在(LuaSrcDir)/src 中将 slua.c 也拷贝进来但是要排除 lua.cluac.c 这两个文件。 在 lua.dll.c 中加入以下内容 #define LUA_COMPAT_5_1
#define LUA_COMPAT_5_2// Lua source code only, relative .
#include “$(LuaSrcRelativePath)/src/lapi.c”
#include “$(LuaSrcRelativePath)/src/lauxlib”
#include “$(LuaSrcRelativePath)/src/lbaselib.c”
…
// Add all lua source file *.c, exclude lua.c, luac.c.
//#include $(LuaSrcRelativePath)/src/lua.c
//#include $(LuaSrcRelativePath)/src/luac.c#include “$(LuaSrcRelativePath)/src/slua.c” 注意以上所有内容都是添加 Lua 的源文件不包括头文件具体开头使用要使用哪些预编译宏取决于你的项目。 另外由于 Lua 5.3 向下兼容的问题如果定义了 LUA_COMPAT_5_1后LUA_COMPAT_MODULE 会被定义那么就会编译兼容实现luaL_findtable而 SLua 中为了兼容多写了一份所以这时候可以删掉 slua.c 中的实现否则编译会出现重定义的错误。 接下来在 Unity Player Setting 中加入预编译宏 LUA_5_3 将 SLua 切换到 5.3 的实现版本然后就直接将某个示例场景添加的构建列表BuildAndRun就可以看到 SLua 的 Demo 场景正确的运行在浏览器上了。 至此Lua 的 Native Plugin 部分已完成可以往下走了。