Мультиплеер обернулся как минимум втрое большими затратами времени и количеством проблем, чем я ожидал бы от разработки Sunderstar без него. Даже сравнительно простой космический шутер усложняется, когда клиент и сервер не согласны, где должен находиться корабль или снаряд.
Проблемы проявлялись в базовых действиях. Ожидание обновлений сервера задерживало отклик на управление движением. При столкновениях расхождения клиента и сервера могли оттягивать корабль обратно в скорректированную позицию. Запоздавшие обновления мешали плавно показывать движение удалённых объектов.
Со стрельбой были похожие проблемы. При разбросе оружия надёжно сопоставить мгновенный локальный выстрел со снарядом сервера не получалось. Коррекция к более старой серверной позиции могла заставить его прыгнуть назад или зрительно изменить скорость. Эффекты попаданий тоже должны были появляться вовремя и не вспыхивать повторно после подтверждения сервера.
Я изменил локальный корабль так, чтобы он сразу предсказывал движение теми же расчётами, что и сервер, а после получения обновлений корректировал расхождения. Другие корабли плавно движутся между полученными позициями, с ограниченным прогнозом движения при задержке обновлений.
Столкновениям тоже нужно предсказание. Клиент теперь рассчитывает реакцию вашего корабля на астероид или другой корабль по данным о столкновениях с сервера. Локально перемещается только ваш корабль. Малые коррекции позиции сглаживаются; крупные изменения, например телепортации, происходят сразу.
Визуальный снаряд теперь принимает серверное направление без прыжка назад и сохраняет постоянную скорость. Эффекты попаданий появляются локально, а соответствующие серверные эффекты подавляются, чтобы одно попадание не вспыхивало дважды. Попадания и урон по-прежнему определяет сервер.
Я также привёл появление снарядов, дульные вспышки, звук и повторное воспроизведение к одной позиции на конце ствола. Изменение предсказания движения даже выявило ошибку владения ботом в режиме Host, которую тоже пришлось исправить.
Автоматические проверки прошли, а метрики в сетевой симуляции Unity уже улучшились. Эти улучшения ещё нужно проверить в настоящей игровой сессии через интернет с выделенным сервером.
Если вы работали над мультиплеером, какая на вид простая возможность потребовала больше всего времени, чтобы заработала как надо?