转自:https://www.cnblogs.com/yaukey/p/unity_webgl_explore_1.html

查找了 Unity 的官方资料,我们如果需要使用 WebGL 需要面对以下几个挑战:

  1. Native Plugin:也就是说各种原生插件(C/C++等编译的本地机器码库),我们的挑战是使用了 SLua。
  2. 多线程:WebGL 端无法支持任何多线程代码,因为 JavaScript 没有多线程的实现,C# 端使用的类似 System.Threading 等库最终都不会被编译成相应的 js 代码。
  3. 网络模块:传统的 Socket 无法使用,必须使用 WebSocket 或者 xxx,System.Net,尤其是 UnityEngine.Net.Sockets 都未在 WebGL 端实现,所以将无法被正确编译转换;Unity 中可以使用 WWW 和 UnityWebRequest,或者使用新版支持 WebGL 的 Unity Networking API;或者直接在 JavaScript 中使用 WebSockets 和 WebRTC 来实现网络层功能。
  4. 渲染:WebGL 的图形 api 是基于 OpenGL ES 2.0;GI 只支持 Baked GI(我们没使用);Procedural Materials 不支持(我们没使用);Linear Rendering 不支持(我们没使用);MovieTextures 不支持(我们没使用);WebGL Shader code restrictions:目前理解为在 shader 代码中只支持使用常量,循环的索引值或者联合体来作为访问数组和矩阵的索引,唯一的例外是在 Vertex Shader 中访问 uniform 时可以使用任意的表达式,另外还有循环的限制,不可以使用 “计数循环-初始化一个变量时赋给一个常量值,每次循环时增加或减少一个常量值” 以外的方式,并且不支持 while 循环。(目前大致看来我们没有使用数组或矩阵的下标表达式,也没有使用复杂的循环,后期可能还需要仔细排查)。
  5. Audio 有几乎一大半的 api 不支持,后面需要做兼容修改,应该不少麻烦。
  6. 其它暂不考虑,以上几项直接决定我们是否可以先 Port 出来,效率问题都先不考虑。
  7. 先从 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.c,luac.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 部分已完成,可以往下走了。

关于 Unity WebGL 的探索相关推荐

  1. Unity WebGL 窗口自适应

    unity 打包好WebGL后,用文本编辑器编辑打包生成的 index.html 文件 在生成的html里面修改代码 <script type="text/javascript&quo ...

  2. [Unity-经验]从购买云服务器到发布Unity WebGL项目

    [Unity-经验]从购买云服务器到发布Unity WebGL项目 前言 一.WebGL的导出 1. 导出设置 二.服务器购买 1. 带宽的选择 2. 服务器的配置 3. 服务器各个属性的意义 三.项 ...

  3. unity webgl打包 苹果12以上机型打开连接后模型黑屏卡帧问题

    unity webgl打包 苹果12以上打开模型卡帧问题 查找到问题大概是跟场景灯光阴影相关, 如果关闭阴影 在苹果12以上的机型上打开就会出现卡帧问题 解决方案: 灯光这样设置就可以解决卡帧问题

  4. Unity Webgl内嵌网页页面

    Unity Webgl端有时候会有这样一个需求,在Unity界面上内嵌一个网页,并且可以在界面上把这个网页关掉(不是重新打开新的标签页) 效果如下: 现在来实现这个功能: 1.在Assets文件夹下新 ...

  5. unity webgl优化

    对Unity开发WEBGL印象就是开发方便打包慢输出内容加载慢不支持移动端一堆堆问题.但是最麻烦的还是加载慢真的慢. 所以通过对各种h5开发对比准备放弃Unity发布WEBGL的做法.但是随着unit ...

  6. Unity WebGL错误集锦

    ips: 0 Unity的PlayerSettings的otherSettings或者Publish Settings里面的Enable Exceptions里面选择Full StackTrace , ...

  7. 2021-09-29 Unity WebGL平台开发遇到的坑

    内容简介:最近在用Unity做一个 WebGL 平台的项目,开发过程中遇到了各种各样的坑,这里简单记录一下,以免以后再踩.首先是Http请求的问题,我最开始想的是,直接用C#里的写法,编辑器里测试毫无 ...

  8. Unity WebGL 下载替换Word模板数据

    文章目录 插件包介绍 一.导入自己Word模板 二.设置Word模板 三.创建报告基础数据 四.初始化下载Word 参数 五.打包WebGL 六.设置配置文件 1.文件位置 2.设置参数 3.配置文件 ...

  9. 记录Unity WebGL发布到IIS服务器时遇到的坑

    上次弄页游还是Unity 4.x的时候,用的CentOS 7.Apache,直接SFTP上传到网站目录,浏览器一打开就能正常游玩了.但是没寻思今天,在一个Windows服务器上,使用IIS运行Unit ...

最新文章

  1. 一道vector实现字典的题目 C++
  2. 分布式服务器客户端实验
  3. 出现在海马#30524;前的c++
  4. 软件工程-第二次作业-例行报告
  5. mouseover/out和mouseenter/leave的区别及用法
  6. java 路径中代替斜杠_老生常谈java路径中的反斜杠和斜杠的区别
  7. [转载] PyTorch: 序列到序列模型(Seq2Seq)实现机器翻译实战
  8. linux 列出指定目录下所有文件的 列表集合
  9. 计算机一级考试题库字处理题库,全国计算机一级考试题库试题
  10. 如何查看opencv版本
  11. (十)Redis集群(JedisCluster)Jedis客户端命令详解
  12. Web安全—常见加密编码方式详解(持续更新)
  13. 格力成立子公司造芯片 亲自挂帅的董明珠能成功吗
  14. html如何制作电子邮件地址怎么写,如何制作html电子邮件?
  15. 【幸福是什么,幸福的含义到底有多深呢?】
  16. Java打印实心菱形和空心菱形
  17. 附件 计算机 丢失,Win10系统开始菜单中没有附件解决方法
  18. 在gentoo上使用sway
  19. 开机自动拨号与DDNS(废弃该方式)
  20. android电池管理系统

热门文章

  1. centos右上角wired图标消失有效解决方案【转载】
  2. python爬取今日头条的文章_Python3爬取今日头条有关《人民的名义》文章
  3. c++矩阵类_面向对象有限元编程|单元类
  4. python整形怎么切片_python 切片操作 slice
  5. putty保存用户名和密码_社保局官网搬家啦!忘记用户名、密码肿么办?自救指南来一波!...
  6. centos8安装文件服务器,centos8 服务器环境部署
  7. linux docker查看容器状态,Docker容器状态命令行工具——Ctop
  8. main方法 如何去掉http debug日志_在MyBatis中如何使用collection标签实现嵌套查询?...
  9. mysql是小型数据库_mysql小型数据库
  10. vue.js能美化界面吗_vue将单页面改造成多页面应用的方法