关于 Unity WebGL 的探索(二)

上一篇博客记录了关于 WebGL 移植的第一步:部分 C/C++ 插件的编译,目前项目中的部分插件使用该方法通过,接下来比较大的一部分工作量是网络模块 WebSocket 的网络层实现。

WebSocket.org 网站提供了最近本的 WebSocket 的使用示例,其标准规范定义以及相关的的 API 文档都比较全,同时支持安全的 wss 协议。

目前主流的浏览器都支持 WebSocket,可以在这里 WebSocket.org 测试你的浏览器是否支持。

所有的定义和接口都是基于 javascript 的,所以在 Unity 中使用需要创建一份 javascript 的实现,这里可以先参考 Unity 的官方示例:Simple Web Sockets for Unity WebGL。它完整的实现了链接的建立,关闭,消息的收发,但是作为简单的 Demo,健壮性和扩展性肯定是不足的,这里我建议购买使用 Best HTTP,其完整的包装了 WebSocket,在上层提供了统一简单的接口,扩展性也很好,健壮性也不错,基本涵盖了所有的事件到 C# 端处理。不过需要注意的是,默认的消息数据类型是 arrayBuffer,没有处理 binary,如果需要的话自己去扩展下,这部分在 Simple Web Sockets for Unity WebGL 可以找到参考,或者阅读下 API 文档。

这部分都是基于 Build WebGL 平台的实现,如果想在编辑器下,那么必须有在 C# 端实现的 WebSocket 协议,Best HTTP 自己实现了 C# 端的协议支持,不过你也可以使用 websocket-sharp,Unity 的 Demo 也使用了这个。

至于如何创建插件以上的示例都有,不赘述。我后来选定的方案是,使用 Best HTTPjavascript 下的 WebSocket 实现 + websocket-sharp
,不完整使用 Best HTTP 的原因是我们项目已有自己的网络底层实现,只需要在 WebGL 平台替换相应的网络连接关闭,以及数据的收发即可,所以我进行了剥离,只选取我要的部分进行修改完善。在 C# 端的接口只提供名为 WebSocket 的类,里面处理各个平台即可。

截至以上部分,完整的实现了需要的 WebSocket 网络支持,接下来只需要在 WebGL 平台下替换项目中的网络接口即可。

另外,过程中发现了 5.6.1 的一个 Bug:同时开启 Development BuildUse pre-built Engine 构建出的 WebGL 应用无法正确执行 javascript 插件代码,会出现类似如下的错误:

"An error occured running the Unity content on this page. See your browser JavaScript console for more info. The error was:
ReferenceError: webSocketInstances is not defined"

目前已经给官方提交了 Bug 并得到确认,如果使用的话请注意。

当尝试完这部分工作后,又得到一个重磅消息:处于某种原因,项目 WebGL 版本移植工作暂停,恢复时间待定。

想说啥来着,一开始不想做可又不得不做,刚有点眉目又不用做了,生活中这种事情其实还不少,只要不要太入戏即可。在写这篇博客时该工作已经结束了快有一个月了。

关于 Unity WebGL 的探索(二)的更多相关文章

  1. 关于 Unity WebGL 的探索(一)

    到今天为止,项目已经上线一个多月了,目前稳定运行,各种 bug 也是有的.至少得到了苹果的两次推荐和 TapTap 一次首页推荐,也算是结项后第一时间对我们项目的一个肯定. 出于各种各样的可描述和不可 ...

  2. 使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍

    使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍 Photon PUN Unity 网络游戏开发 Photon常用类介绍: IPunCallback PUNGIPunCa ...

  3. Unity的Json解析<二>–写Json文件

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50378805 作者:car ...

  4. Unity WebGL 窗口自适应

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

  5. Unity——技能系统(二)

    Unity技能系统(二) Unity技能系统(一) Demo展示: 五.技能管理和释放 1.CharacterSkillSystem 技能系统类,给外部(技能按钮,按键)提供技能释放方法: 技能释放逻 ...

  6. WebGL入门教程(二)-webgl绘制三角形

    前面已经介绍过了webgl,WebGL入门教程(一)-初识webgl(http://www.cnblogs.com/bsman/p/6128447.html),也知道了如何绘制一个点,接下来就用web ...

  7. Unity 依赖注入之二

    1. 构造子注入 1.1 构造子注入初级代码 container.RegisterType<IMyWork, MyWork>(new InjectionConstructor(new Bo ...

  8. Unity WebGL MoonSharp崩溃问题

    当前Unity的代码更新方案基本都选择的ULua,而我们项目还需要考虑Web平台,ULua不支持WebGL,所以决定选择MoonSharp.MoonSharp(http://www.moonsharp ...

  9. Unity 用户手册用户指南二维纹理 (Texture 2D)

    http://www.58player.com/blog-2327-953.html 二维纹理 (Texture 2D) 纹理 (Textures) 使您的 网格 (Meshes).粒子 (Parti ...

随机推荐

  1. python基础---输入输出

    1.输入字符串. name=input()   or name=input('please input a string') 这样可以接收一个字符串,包括空格,都可以输入.只有回车不接受,作为结束符, ...

  2. [Luogu 2805] NOI2009 植物大战僵尸

    这题是个比较经典的最大权闭合子图,可以建图转化为最小割问题,再根据最大流最小割定理,采用任意一种最大流算法求得. 对于每个点,如果点权w为正,则从源点到这个点连一条边权为w的有向边:否则如果w为负则从 ...

  3. 【Codeforces370E】Summer Reading [构造]

    Summer Reading Time Limit: 20 Sec  Memory Limit: 512 MB Description Input Output Sample Input 7 0 1 ...

  4. 「6月雅礼集训 2017 Day10」quote

    [题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...

  5. UOJ#204 【APIO2016】Boat

    Time Limit: 70 Sec  Memory Limit: 256 MBSubmit: 559  Solved: 248 Description 在首尔城中,汉江横贯东西.在汉江的北岸,从西向 ...

  6. MySQL数据库运行环境的搭建

    第一步:安装wampserver2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b文件,安装过程中可能会遇到问题,把遇到的问题代码复制粘贴到360人工服务,查找方案 ...

  7. Http跨域时候预检没通过的几种原因

    网上大多数涉及的原因(直接复制粘帖): CORS把HTTP请求分成两类,不同类别按不同的策略进行跨域资源共享协商. 1. 简单跨域请求. 当HTTP请求出现以下两种情况时,浏览器认为是简单跨域请求: ...

  8. POJ 3279 Fliptile ( 开关问题)

    题目链接 Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give ...

  9. 获取天气api

    http://wthrcdn.etouch.cn/WeatherApi?citykey=101010100通过城市id获得天气数据,xml文件数据,当错误时会有<error>节点http: ...

  10. TCP之connect

    1. connect函数: #include <sys/socket.h> int connect(int sockfd, const struct sockaddr *servaddr, ...