关于 Unity WebGL 的探索

转自: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 部分已完成,可以往下走了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity脚本生命周期与执行顺序

目录 脚本生命周期 MonoBehavior生命周期图脚本执行顺序 自定义执行顺序 (文章目录) 在Unity中,脚本可以理解为附加在游戏对象上的用于定义游戏对象行为的指令代码。必须绑定在游戏对象上才能开始它的生命周期。游戏对象可以理解为能容纳各种组件的容器&#xff0c…

Unity3D(UE4)加载倾斜摄影数据OSGB格式

在Unity3D平台动态加载调度倾斜摄影数据,利用多线程动态加载瓦片数据,可以顺畅加载海量的瓦片数据。目前测试可流畅加载100G左右数据,支持加载本地数据,数据可不放在Unity工程内,也可以将数据放置在服务器上实现网络加…

Unity打包失败解决方案

更改设置即可 :Edit -> Graphics Emulation-> Shader Hardware Tier 1

Unity3D实现谷歌数字地球

Unity3D实现谷歌地球 在Unity3d平台实现的类似谷歌地球的功能,可动态加载谷歌,ArcGis,BingMap,天地图影像,也可加载国界线等矢量文件以及在线加载高程文件。 视频链接: 地球操作:https://www.bilibili.com/video/BV1mT4y1P771 地球漫游:h…

Unity罗技方向盘接入

要想在Unity中接入罗技方向盘的数据,首先必须安装驱动,并且打开安装的软件,否则在Unity中会一直连接不成功。状态如下: 然后下载相应的开发包Logitech SDK即可,需要替换相应的LogitechSteeringWheelEnginesWrapper.dll…

sscanf

sscanf() 2010-01-28 11:53:42| 分类: Work|举报|字号 订阅 下载LOFTER我的照片书 |定义函数 int sscanf (const char *str,const char * format,........); 函数说明 sscanf()会将参数str的字符串根据参数format字符串来转换并格…

字典树

微博:TankyWoo基新博客:TankyWooTanky Woo的前博客 字典树(讲解模版) 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串…

Unity3D谷歌地球

Unity3D实现谷歌地球 在Unity3d平台实现的类似谷歌地球的功能,可动态在线加载谷歌,ArcGis,BingMap,天地图等影像,也可加载国界线等矢量文件以及在线加载高程文件。 视频链接: 地球操作:https://www.bilibili.com/video/BV1mT4y1P771 地球…

线段树的操作

登录 | 注册 MetalSeed 思绪来得快去的也快,偶尔会在这里停留。 目录视图摘要视图订阅 移动信息安全的漏洞和逆向原理 程序员11月书讯,评论得书啦 Get IT技能知识库,50个领域一键直达数据结构专题——线段树 标签: …

UE4加载osgb倾斜摄影数据

在UE4引擎中动态加载调度osgb倾斜摄影数据,利用多线程动态加载瓦片数据,可以顺畅加载海量的瓦片数据。最大可加载200G以上数量级。 Unity3D加载osgb倾斜摄影数据:Unity3d(UE4)动态加载osgb倾斜摄影数据_Answer-3的博客-CSDN博客_unity加载osgb qq:1749…

Unity/UE读取OPC UA和OPC DA数据(UE4)

Unity/UE4通过OPC UA和OPC DA协议读取PLC数据,通过采集服务将数据采集到数据库中,Unity3d和UE4再从数据库中读取数据进行展示,用于三维数字孪生系统接入自动化系统的硬件数据。支持WinCC,组态王,Kepware等组态软件的数据接入。 W…

Unity3d(UE4)动态加载osgb倾斜摄影数据

在Unity3D平台动态加载调度倾斜摄影数据,利用多线程动态加载瓦片数据,可以顺畅加载海量的瓦片数据。目前测试可流畅加载200G左右数据,支持加载本地数据,数据可不放在Unity工程内,也可以将数据放置在服务器上实现网络加…

RMQ算法

RMQ算法 标签: 算法querytable2012-08-28 20:53 14613人阅读 评论(7) 收藏 举报分类:nyist(26) 数据结构(5) 1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询…

bellman ford 算法 判断是否存在负环

Flyer 目录视图摘要视图订阅 微信小程序实战项目——点餐系统 程序员11月书讯,评论得书啦 Get IT技能知识库,50个领域一键直达关闭bellman ford 算法 2013-05-25 15:36 11148人阅读 评论(0) 收藏 举报分类:ACM(11&a…

C++ vector用法

C vector用法 在c中&#xff0c;vector是一个十分有用的容器&#xff0c;下面对这个容器做一下总结。 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象&#xff0c;vector<int> vec; (3)尾部插入数字&#xff1a;vec.push_back(a); (4)使用下标访问元素&…

字典树(Trie树)

字典树(Trie树)字典树&#xff0c;又称单词查找树&#xff0c;Trie树&#xff0c;是一种树形结构&#xff0c;典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff0c;所以经常被搜索引擎系统用于文本词频统计。它的优点是&#xff1a;利用字符串的公共前缀来节约存…

网络流之最大流算法(EdmondsKarp)

网络流之最大流算法&#xff08;EdmondsKarp&#xff09; 标签&#xff1a; 网络流算法EdmondsKarp流量最大流2014-03-11 18:05 34795人阅读 评论(12) 收藏 举报分类&#xff1a;图论~~网络流&#xff08;26&#xff09; 版权声明&#xff1a;本文为博主原创文章&#xff0c;未…

set 用法

Set常用用法 2013-04-22 19:24 86508人阅读 评论(1) 收藏 举报分类&#xff1a;CPlus&#xff08;54&#xff09; set集合容器&#xff1a;实现了红黑树的平衡二叉检索树的数据结构&#xff0c;插入元素时&#xff0c;它会自动调整二叉树的排列&#xff0c;把元素放到适当的位置…

C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈

C语言用递归求斐波那契数&#xff0c;让你发现递归的缺陷和效率瓶颈 分享到&#xff1a;QQ空间新浪微博腾讯微博豆瓣人人网递归是一种强有力的技巧&#xff0c;但和其他技巧一样&#xff0c;它也可能被误用。一般需要递归解决的问题有两个特点&#xff1a;存在限制条件&#xf…

C语言中文件的读取和写入

C语言中文件的读取和写入 注意&#xff1a; 1、由于C是缓冲写 所以要在关闭或刷新后才能看到文件内容 2、电脑处理文本型和二进制型的不同 &#xff08;因为电脑只认识二进制格式&#xff09; 在C语言中写文件 //获取文件指针 FILE *pFile fopen("1.txt", //打开文件…