Мультиплеер обернулся как минимум втрое большими затратами времени и количеством проблем, чем я ожидал бы от разработки Sunderstar без него. Даже сравнительно простой космический шутер усложняется, когда клиент и сервер не согласны, где должен находиться корабль или снаряд.

Проблемы проявлялись в базовых действиях. Ожидание обновлений сервера задерживало отклик на управление движением. При столкновениях расхождения клиента и сервера могли оттягивать корабль обратно в скорректированную позицию. Запоздавшие обновления мешали плавно показывать движение удалённых объектов.

Со стрельбой были похожие проблемы. При разбросе оружия надёжно сопоставить мгновенный локальный выстрел со снарядом сервера не получалось. Коррекция к более старой серверной позиции могла заставить его прыгнуть назад или зрительно изменить скорость. Эффекты попаданий тоже должны были появляться вовремя и не вспыхивать повторно после подтверждения сервера.

Я изменил локальный корабль так, чтобы он сразу предсказывал движение теми же расчётами, что и сервер, а после получения обновлений корректировал расхождения. Другие корабли плавно движутся между полученными позициями, с ограниченным прогнозом движения при задержке обновлений.

Столкновениям тоже нужно предсказание. Клиент теперь рассчитывает реакцию вашего корабля на астероид или другой корабль по данным о столкновениях с сервера. Локально перемещается только ваш корабль. Малые коррекции позиции сглаживаются; крупные изменения, например телепортации, происходят сразу.

Визуальный снаряд теперь принимает серверное направление без прыжка назад и сохраняет постоянную скорость. Эффекты попаданий появляются локально, а соответствующие серверные эффекты подавляются, чтобы одно попадание не вспыхивало дважды. Попадания и урон по-прежнему определяет сервер.

Я также привёл появление снарядов, дульные вспышки, звук и повторное воспроизведение к одной позиции на конце ствола. Изменение предсказания движения даже выявило ошибку владения ботом в режиме Host, которую тоже пришлось исправить.

Автоматические проверки прошли, а метрики в сетевой симуляции Unity уже улучшились. Эти улучшения ещё нужно проверить в настоящей игровой сессии через интернет с выделенным сервером.

Если вы работали над мультиплеером, какая на вид простая возможность потребовала больше всего времени, чтобы заработала как надо?