У меня многопользовательская игра, и я делаю предсказания на стороне клиента, но некоторые игроки могут выпить зелье и стать невидимым ...
Проблема в том, что, когда они становятся невидимыми, я не делюсь ничем, что клиент мог бы использовать, чтобы знать, что он там, поэтому, когда игрок пытается войти в тайл, занятый невидимым игроком, он предсказывает, что ему это удается, и затем получает некрасивая коррекция положения, отправленная сервером.
Одним из решений было бы поделиться чем-то, чтобы клиент мог сказать, но тогда хакеры могли бы использовать это, чтобы выяснить, где находятся невидимые игроки, обманывающие.
Кстати, я уже решил регулярное предсказание движения, оно работает отлично.
multiplayer
client-server
affiszervmention
источник
источник
Ответы:
Это можно считать проблемой анимации. Если коррекция положения возвращается с сервера из-за попытки переместиться в невидимый объект, отправьте обратно не только исправление, но и флаг, указывающий, почему исправление было необходимо. Вместо того, чтобы игрок швырялся назад, он может делать «вау», покачивая анимацию назад, делая его более правдоподобным, как будто он просто наткнулся на что-то.
В играх, использующих этот подход, нередко удаляют невидимость (по крайней мере на мгновение) из всего, с чем сталкивались. Среди прочего, это дает стимул невидимым игрокам избегать скопления людей или сближения с другими персонажами, снижая частоту столкновений с невидимым игроком в первую очередь. Таким образом, даже если ваша анимация для такого рода столкновений слаба (или вообще отсутствует), она несколько скрыта от невидимого персонажа, который появляется в поле зрения и ясно передает всем, что только что произошло.
Анимацию нужно убрать, не позволяя невидимости работать с близкого расстояния. Это дает еще больший стимул невидимым игрокам избегать сближения с другими персонажами. Это обычный подход для стелс-игр и ИИ (замените «невидимый» на «невидимый для цели») и его можно увидеть в PvP-играх, таких как World of Tanks. Не нужно беспокоиться о реакции на столкновение с невидимыми символами, если у вас нет ничего невидимого, когда вы находитесь достаточно близко, чтобы столкнуться с ним (в пределах задержки).
Решение Дракора просто игнорировать столкновения с невидимыми объектами также является хорошим решением. Это снова требует некоторой анимации (для клиента невидимых игроков), поэтому объекты не просто просматривают аватар игрока на его экране. Если ничего другого, вы можете заставить видимые объекты всегда выдвигать невидимые, так что невидимый игрок автоматически удаляется с сервера, если кто-то сталкивается с ним.
Невидимые-невидимые столкновения немного сложнее. Может быть выгодно просто отключить коллизии на них, так как никто не может видеть, обрезаются ли два невидимых объекта (под «невидимым» мы подразумеваем, что оба объекта не видимы для одного и того же клиента). Если один из объектов становится видимым, он автоматически возвращается к реакции видимого-невидимого столкновения (отталкивает невидимый объект).
Все становится сложнее, если невидимость имеет сложные наборы того, кто кого может видеть. Первое или второе решение выше, вероятно, лучше всего здесь, если вам это нужно. Не каждая такая проблема нуждается в техническом решении; многим просто нужны дизайнерские решения (например, не позволяйте этой функции вашим дизайнерам).
источник
Я действительно вижу здесь только два варианта, если вы не хотите сообщать клиенту, где находится невидимый игрок: 1) Вы игнорируете столкновение юнитов для невидимых игроков - простое решение, и игроки не смогут найти невидимых игроков, тесты на столкновение тоже. 2) После выбора прогнозируемого пути вы отправляете серверу прогнозируемый путь и исправляете сам путь на стороне сервера, а затем отправляете новый путь обратно.
источник
Если я что-то не так понимаю, решение простое. Не отправляйте клиенту информацию обо всех невидимых игроках, только о тех, кто находится в пределах досягаемости, чтобы они могли столкнуться в пределах движения в течение прогнозируемого интервала. Другими словами, если клиенту нужно только предсказать 200 мс в будущем, отправляйте информацию только о невидимых игроках в пределах
max_player_velocity units/sec * 1/5 sec
отрядов.источник