Задать вопрос
@PantyDev

Решил сделать свой пет-проект — игру, с использованием вебсоккетов, как лучше организовать неткод?

Решил сделать простенькую и пробную онлайн игру. Вебсоккет сервер я решил сделать на NodeJS (библиотека ws), клиент на С#(unity) с использованием библиотеки websocket-sharp.
Когда дошёл до передвижений других пользователей столкнулся с проблемой. Проблема вроде и банальная, но я даже не знаю как сформулировать запрос к гуглу, чтобы найти ответ.
Тут вопрос не в коде, а именно в реализации.

В общем вопрос заключается в следующем - когда один из пользователей перемещается, он пересылает данные на сервер о том что двигается. Как он должен это делать?
Тут я вижу два варианта:
  • В методе Update проверка на смещение позиции в Transform. Если сместился пользователь - отправляем данные на сервер и рассылаем всем остальным. Минус данного метода в том, что таким образом можно задудосить сервер, слишком часто данные отсылаются. И сам пользователь у других двигается "дёрганно", так как пакеты приходят не так быстро. Плюс данного способа - точность в координатах. Но в остальном всё плохо.
  • Отсылаем нажатия пользователей, например если пользователь зажал horizontalInput мы отправляем данные, что этот инпут изменился на клиенты других пользователей. Таким образом, если мы смотрим с экрана другого пользователя, то объект OtherPlayer вместо нажатий с клавиатуры, принимает данные инпутов, приходящие с сервера. Такой способ исправит "дёрганность", но к сожалению, я беспокоюсь что сделает высокую вероятность рассинхрона. Ведь согласитесь, если моделька другого игрока хоть как-то сместится у основного пользователя, сервер этого никак не поймет, и будет смещать его уже не там где надо и как надо.


Как в таком случае это лучше сделать? Может стоит "комбинировать методы"? За основу взять второй способ и например после каждого инпута отправлять повторно данные на сервер, но уже с точными координатами? Чтобы на других клиентах "уточнить" где находится игрок, и если надо - телепортировать его туда где он должен быть?
  • Вопрос задан
  • 147 просмотров
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Ты поднял очень трудную задачу. Ее многие игровые серверы фиксят годами. А потом еще борются с читерами.

Можно на сервер передавать твои клавиатурные нажатия. С высоким приоритетом. Сервер будет интерполировать
и создавать свою модель мира попутно проверяя тебя чтоб ты там не сильно телепортировался далеко.

И все игроки тоже должны получать координаты всех. Как-бы рассылкой.

Кстати подумай над UDP. Понятное дело что в рамках websocket у тебя диапазон возможностей будет
ограничен тем что дано. Но мне кажется что производительный игровой сервак должен делать TCP
как-бы обязательной частью протокола. И далее если клиент поддерживает (провайдер пускает)
то можно договориться (negotiation) на уровне софта о дополнительной рассылке по UDP каких
то не шибко важных событий игрового мира.
Ответ написан
saboteur_kiev
@saboteur_kiev Куратор тега Разработка игр
software engineer
Зависит от вашего приложения.
В шутерах шлются упрощенно "кейпрессес", туда, действия объектов "оттуда" и достаточно часто.
Но именно поэтому шутеры ограничены количеством игроков.

В РПГ шлются действия типа "игрок кастанул заклинание", "игрок нажал бежать на X и Y", после чего сервер просчитывает что происходит и шлет назад уже координаты видимых объектов с их статусом.

Это становится понятно из управления - в условном контр-страйке для передвижения ты нажимаешь и отпускаешь стрелки. В условном MMORPG ты так не можешь, ты кликаешь мышкой в нужное место, и персонаж туда бежит по логике сервера (учитывая препятствия), но микроменеджментом ты не занимаешься.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы