Что посоветуете для написания сервера под мультиплеерную 3d игру на Unity?
Доброго времени суток!)
Я планирую сделать простой мультиплеерный 3d шутер на Unity, собственно от сюда возникает вопрос:
Как написать сервер (буду писать на C#) у меня очень не большой опыт в разработке клиент-серверных приложений только многопоточный чат(TCP), и я практически не имею представления как реализовать взаимодействие игроков с сервером.
Что нужно будет синхронизировать:
1) Позицию игрока в пространстве, его поворот и наклон оружия.
2) Смена оружия.
3) Стрельба (синхронизация точки спавна пули).
4) Чат (в принципе не обязательно, если я смогу сделать первые 3 пункта то с чатом проблем думаю не возникнет).
Моя идея как это реализовать:
1) Под каждого игрока, разумеется есть свой поток.
2) Сервер должен перед рассылкой действий пользователя проверить их на правильность (античит так сказать).
Когда игрок будет подключатся к серверу, 1-ое что он должен будет передать, это свой идентификатор(к примеру название gameobject'a в Unity) в игровой комнате, а первое сообщение которое он должен получить это позиции других игроков. Далее нужно как-то передавать новую позицию игрока вместе с поворотом(это вроде проблем не вызывает, можно передавать 1 сообщением "позиция/поворот/наклон"), а что если игрок будет на ходу поворачиваться и стрелять, это тоже передавать 1 сообщением после паaрсить команды и отправлять их на проверку, если они верны рассылать другим игрокам иначе выдать предупреждение игроку а после 3-ех кикать?
Как вам?
Мне бы что нибудь почитать по реализации серверов для шутеров или подобных игр исходники или документацию(на любом языке не обязательно на C#), теории я уже начитался но вот все есть сомнения по реализации сервера.
P.S. Я знаю что есть UNet, и т.п. но я пишу собственный сервер ради интереса и опыта)
P.P.S. Спасибо всем за все ;)
Нужно учитывать коридоры возможного перемещения вместе с предельной скоростью, чтобы получить время и сравнить его с допустимым.
Допустимое, определяется через обученную НС на нескольких случайных перемещениях игрока из одной точечной позиции в случайные стороны (и под различными углами, если это 3D) с различными параметрами (грунт, гравитация, прыжок, ходьба/бег и т.д.) между соседними позициями за один игровой кадр ("тик").
И как только игрок набирает N-штрафных баллов (3-5 достаточно) - фиксируется чит.
по нормальному карта должна быть и на серваке, чтобы игроки не могли ходить сквозь стены например.
еще в данной задаче не очень очевидно с начала, но важно делать предсказание движения противников на клиенте.
недостаточно просто передавать пересчитанные координаты игроков с сервера, нужно еще делать предпросчет на клиенте, иначе играть будет невозможно, позиция игрока-противника постоянно будет опаздывать. в быстрых играх это не допустимо.
по нормальному карта должна быть и на серваке, чтобы игроки не могли ходить сквозь стены например.
Это им не помешает ходить сквозь стены при "кривой" проверке на стороне сервера. Нужно учитывать коридоры возможного перемещения вместе с предельной скоростью, чтобы получить время и сравнить его с допустимым.
Допустимое, определяется через обученную НС на нескольких случайных перемещениях игрока из одной точечной позиции в случайные стороны с различными параметрами (грунт, гравитация, прыжок, бег и т.д.) между соседними позициями за один игровой кадр ("тик").
И как только игрок набирает N-штрафных баллов (3-5 достаточно) - фиксируется чит.
xmoonlight, c НС мне кажется мало кто заморачивается, да и мутно как то все получается.
что на вход нужно подавать?
если идти по такому принципу (чтобы не загружать на сервере всю карту), то проще определить несколько мертвых зон в которых точно не должно быть игроков, и если ктото заходит в одну из них - банить. так хотя бы будет все более предсказуемо.
Юрий, Ничего нет мутного здесь - читайте линки и разбирайтесь.
"Мёртвая" зона - не поможет, т.к. существуют стены, перед которыми и за которыми можно перемещаться игрокам.
Дамир,
1. Писать с нуля или брать из ассет-стора?
2. Неизвестно насколько он будет производителен для большого количества игроков с физ-движком на серверной стороне....
3. Проблему с проходом - это не решит, если нет контроля времени через waypoints (иначе, можно попасть за стенку за один игровой "тик", используя искусственный сетевой лаг).
1.В ассет-сторе вроде нет нормальных(может и есть,но я не видел), так что лучше писать свой.
2.Смотря как реализовать это.
3.Как это может произойти,если сервер проверят ввод пользователя и если неверно,то не применяет его.
Вот простой пример:
Клиент отправляет ввод(номер пакета, позиция, ротация и т.д) и сохраняет в буфер
Сервер получает и добавляет в буфер
Сервер каждый тик обрабатывает все вводы,которые записал в буфер,затем отправляет обновление(позиция,ротация игроков) клиентам
Клиент получает обновление, смотрит в своем буфере данное обновление,и если оно там есть,то сверяет его с полученным(верна ли позиция,ротация и т.д).Если что то НЕ так,то клиент удаляет все из буфера и применяет обновление,которое получил от сервера.
Дамир, сервер не обрабатывает каждый тик - иначе всё бы у всех лагало)
Обработка вводов - не спасёт на сервере: клиент был перед стенкой, потом очутился за стенкой на следующий тик.
Тут только контроль возможности перемещения. А это - проверка зон, ограниченных waypoint-ами... Т.е., чтобы попасть за стенку - нужно пройти входные waypoint-ы сектора. Например, если за стенкой - коридор и нет окон, люков и т.д., нам нужно 2 waypoint-а, ограничивающих отрезок коридора.
И, если игрок очутился за стенкой (координаты) без пересечения одного из них и минимальное время от ближайшего waypoint'a к любому коридорному - ещё меньше, то он точно телепортнулся)
Фиксируем чит!
Ребят всем спасибо за все ваши советы. Я уже имею представление в написание сервера, еще я вычитал что использование tcp в action играх очень плохо сказывается на ping'е, вот сижу изучаю udp который лучше подойдет для этого.
Недавно интересовался вопросом. Пришёл к выводу, что наиболее простой подход, дающий относительно хороший результат - использовать сервис Photon Unity Network. Сервис берёт на себя вопросы связи, синхронизации, матчмейкинга и выбора наиболее быстрого и близкого к игроку регионального мастер-сервера. До 20 онлайн предоставляется бесплатно - вполне достаточно при разработке и тестировании.
Привет, никак не могу понять, ограничение 20 игроков онлайн как действует? Это значит что максимум 20 игроков могу синхронизироваться между собой, то есть находиться в одной комнате, а этих комнат может быть очень много? Или если в комнате максимум 5 человек максимальное количество комнат равняется 4?