记录一次Unity中的同步问题

发布时间:2022-04-01

在以前做的数字孪生应用中,使用的 socket 进行定制协议开发,服务和 Unity 客户端之间可以互相进行通信,在开发时代价太大,除了正常制定数据协议外,还需要针对粘包定制切包协议。在WEB化的过程中,准备把原有的数字孪生服务端进行迁移,使用全新的 asp.net core 进行开发,双方使用 signalR 进行数据交互。

应用结构说明

简要介绍一下应用结构,整个数字孪生应用主要分为四部分,数据采集部分,交互控制部分,数据分发部分,Unity前端部分。

运行起来就是这样的,采集服务会采集各设备运行数据,发送给分发服务,分发服务又根据配置把实时数据分发到各个客户端,客户端也可以发送命令给控制服务对设备进行控制。

问题

这里主要介绍分发的时候,在 unity 中使用导入 signalR 的包,注意,依赖包也需要一并导入,不然他会从自带的 mono 库里进行导入,如果你的项目刚好使用的是 .Net 4.x 配置,那对不起,项目根本通不过编译。如果是使用 .Net Standard ,那有一定的几率可以通过编译。

说回使用,根据文档写出如下代码,接收到服务推送的消息,然后通过 消息中心 转发到各个组件进行处理.

 HubConnection hub = new HubConnectionBuilder()
            .WithUrl("http://signalr-url")
            .WithAutomaticReconnect()
            .Build();

hub.On<string, List<SendPackage>>("channel", (user, msg) =>
{
      //使用消息中心进行进程内转发
      MessageCenter.Send(new { }, "channel", msg);
});

await hub.StartAsync();

这个代码在编辑器里调试运行得非常正常,除了有时候退出编辑器运行还在偷偷收消息以外。然后打包,发布,上线一通操作后,运行起来发现根本收不到消息,这时候查看服务日志发现根本就没有收到连接请求,尝试几次之后更加确认就是 unity 没有发送连接请求了。

解决

然后经过一顿瞎操作多次尝试切换参数之后,发现必须要指定协议类型为 websocket ,跳过token验证,这才可以正常通信。

修改后代码如下

 HubConnection hub = new HubConnectionBuilder()
            .WithUrl("http://signalr-url", 
                        HttpTransportType.WebSockets, 
                        x => x.SkipNegotiation = true)
            .WithAutomaticReconnect()
            .Build();

hub.On<string, List<SendPackage>>("channel", (user, msg) =>
{
      //使用消息中心进行进程内转发
      MessageCenter.Send(new { }, "channel", msg);
});

await hub.StartAsync();
其他阅读

Web前端中实现自定义右键菜单

在原生的桌面应用中,右键菜单是个很常见也很常用的东西,但是在Web应用中,由于浏览器自带了右键菜单,所以我们很少见到应用有自己的右键菜单,但不常见并不代表没有,本文就会介绍一个右键菜单的实现。

查看原文

WPF 入门系列1 环境搭建

本文为WPF 入门系列的第一篇,主要介绍如何搭建 WPF 开发环境。选择 .NET 8.0 作为运行时,工具介绍了 Visual Stido,Rider 和 Visual Studio Code。

查看原文

使用中间件记录网站访问日志记录

对于网站访问日志的记录,一般情况下都是使用现有的日志服务,比如谷歌分析引入轻量 js 文件即可。本文主要介绍对于现有的 Asp.Net Core 网站使用中间件快速记录访问日志。使用中间件的好处:在服务端进行处理,无视客户端类型(特殊信息无法获取);统一处理,不需要对每个地址重复处理等。

查看原文

Apple网页中滚动效果

打开Apple官网查看iPhone页面,我们可以看到一个特殊效果,当你滚动鼠标时,页面不出现滚动效果,但内容却在变化。现在,基于 position : sticky 可以很容易实现这个效果。

查看原文

Unity控制台打印彩色日志

在 Unity 开发过程中,我们经常需要使用 Debug.Log 来输出调试信息。但是在繁杂的控制台信息中,一些重要的信息很容易就被忽略。使用彩色日志可以大幅提升Unity开发中的调试效率。

查看原文