Как уменьшить мерцание с Unity и Socket.IO? - PullRequest
0 голосов
/ 20 февраля 2019

Я сейчас пытаюсь создать простую многопользовательскую игру с Unity и Socket.IO.Однако на данный момент я сталкиваюсь с некоторыми проблемами.Когда я передал позиционные данные на мой сервер nodejs, все испортилось, потому что Unity решила использовать запятую "," вместо точки "."при обработке плавает.Я обошел эту проблему, установив для своей зоны культуры в функции запуска значение en-US:

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

Сделав это, я получил правильные данные на сервере.Но при отправке данных другим пользователям они получают неправильные номера.Например: игрок 1 меняет положение х на 1,23 -> другие игроки получают 123 в качестве значения х.Я снова попытался исправить это и просто разделил значение на 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);
});

Код 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)));

Код Unity для получения новых данных:

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