首页 > 解决方案 > 如何使用 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);
});

标签: node.jsunity3dsocket.iomultiplayerflicker

解决方案


推荐阅读