如何使用Unity和Socket.IO减少闪烁?

时间:2019-02-20 12:45:00

标签: node.js unity3d socket.io multiplayer flicker

我目前正在尝试使用Unity和Socket.IO创建一个简单的多人游戏。但是此刻我面临一些问题。当我将位置数据传递到我的nodejs服务器时,一切都搞砸了,因为Unity决定使用逗号“,”而不是点“”。处理浮子时。我通过将开始功能中的文化区域设置为en-US来解决该问题:

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

这样做,我在服务器上收到了正确的数据。但是,当将数据发送给其他用户时,他们会收到错误的号码。例如:玩家1将x位置更改为1.23->其他玩家收到123作为x值。我再次尝试解决此问题,然后将值除以100。
现在我可以移动一个播放器,其他人将看到他移动到正确的位置。但是现在播放器模型只是在闪烁。只有当它静止不动时,它才完全在那里。我不确定这是我的代码中的错误,还是只是Unity错误,还是我两次打开同一Unity项目(Symlink)的结果。我希望有人对我的项目中发生的事情有所了解。

闪烁:
enter image description here

修改:
服务器端代码:

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);
});

用于发送新职位的统一代码:

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);
});

0 个答案:

没有答案