node.js - 如何使用 Unity 和 Socket.IO 减少闪烁?
问题描述
我目前正在尝试使用 Unity 和 Socket.IO 创建一个简单的多人游戏。但是目前我面临一些问题。当我将位置数据传递给我的 nodejs 服务器时,一切都搞砸了,因为 Unity 决定使用逗号“,”而不是点“。” 处理浮动时。我通过将 start 函数中的文化区设置为 en-US 来解决这个问题:
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
通过这样做,我在服务器上收到了正确的数据。但是在将数据发送给其他用户时,他们会收到错误的号码。例如:玩家 1 将 x 位置更改为 1.23 -> 其他玩家收到 123 作为 x 值。我再次尝试修复这个问题,只是将值除以 100。
现在我可以移动一个玩家,其他人会看到他移动到正确的位置。但是现在播放器模型只是闪烁。只有当它静止时,它才完全在那里。我不确定这是我的代码中的错误,还是 Unity 错误,或者是我两次打开同一个 Unity 项目的方式(符号链接)的结果。我希望有人知道我的项目中发生了什么。
编辑:
服务器端代码:
socket.on('updatePosition', (data) => {
player.position.x = data.position.x;
player.position.y = data.position.y;
player.position.z = data.position.z;
socket.broadcast.emit('updatePosition', player);
});
发送新仓位的Unity代码:
player.position.x = MethodExtensions.twoDecimals(transform.position.x);
player.position.y = MethodExtensions.twoDecimals(transform.position.y);
player.position.z = MethodExtensions.twoDecimals(transform.position.z);
networkIdentity.getSocket().Emit("updatePosition", new JSONObject(JsonUtility.ToJson(player)));
接收新数据的统一代码:
On("updatePosition", (E) => {
string id = MethodExtensions.removeQuotes(E.data["id"].ToString());
float x = E.data["position"]["x"].f / 100.0f;
float y = E.data["position"]["y"].f / 100.0f;
float z = E.data["position"]["z"].f / 100.0f;
NetworkIdentity networkIdentity = serverObjects[id];
networkIdentity.transform.position = new Vector3(x, y, z);
});
解决方案
推荐阅读
- arrays - Perl 解析带有数组的 json
- asp.net-mvc - 在 MVC5 中使用属性路由的正确方法
- javascript - 未在承诺链中发送 Http 响应
- java - 在 Android Studio 中将一个类用于多个输入字段的捷径
- authentication - 当我没有 ID 时执行 CQRS 命令
- python - 如何在 ubuntu 16.04 上安装 pocketsphinx 0.1.15
- python - 将所有列分组并保留非数字
- c# - “ILoggerFactory”不包含“AddConsole”的定义
- python - 为什么函数只返回范围内的第一个值?
- node.js - MongoDB 突变返回空填充对象