Решил сделать простенькую и пробную онлайн игру. Вебсоккет сервер я решил сделать на NodeJS (библиотека ws), клиент на С#(unity) с использованием библиотеки websocket-sharp.
Когда дошёл до передвижений других пользователей столкнулся с проблемой. Проблема вроде и банальная, но я даже не знаю как сформулировать запрос к гуглу, чтобы найти ответ.
Тут вопрос не в коде, а именно в реализации.
В общем вопрос заключается в следующем - когда один из пользователей перемещается, он пересылает данные на сервер о том что двигается. Как он должен это делать?
Тут я вижу два варианта:
- В методе Update проверка на смещение позиции в Transform. Если сместился пользователь - отправляем данные на сервер и рассылаем всем остальным. Минус данного метода в том, что таким образом можно задудосить сервер, слишком часто данные отсылаются. И сам пользователь у других двигается "дёрганно", так как пакеты приходят не так быстро. Плюс данного способа - точность в координатах. Но в остальном всё плохо.
- Отсылаем нажатия пользователей, например если пользователь зажал horizontalInput мы отправляем данные, что этот инпут изменился на клиенты других пользователей. Таким образом, если мы смотрим с экрана другого пользователя, то объект OtherPlayer вместо нажатий с клавиатуры, принимает данные инпутов, приходящие с сервера. Такой способ исправит "дёрганность", но к сожалению, я беспокоюсь что сделает высокую вероятность рассинхрона. Ведь согласитесь, если моделька другого игрока хоть как-то сместится у основного пользователя, сервер этого никак не поймет, и будет смещать его уже не там где надо и как надо.
Как в таком случае это лучше сделать? Может стоит "комбинировать методы"? За основу взять второй способ и например после каждого инпута отправлять повторно данные на сервер, но уже с точными координатами? Чтобы на других клиентах "уточнить" где находится игрок, и если надо - телепортировать его туда где он должен быть?