Свободное движение с NetworkTransform & NetworkAnimator

Мой персонаж игрока перемещается по миру, используя Animator с активированным корневым движением. По сути, система ИИ устанавливает скорости на Аниматоре, который, в свою очередь, управляет анимационными клипами, которые управляют движением персонажа. Поскольку это стандартная функция, обеспечивающая очень реалистичную анимацию без заметного скольжения, я подумал, что это хорошая идея... пока я не добавил сетевую синхронизацию.

Синхронизация символов по сети с помощью NetworkTransform и NetworkAnimation вызывает конфликт этих двух компонентов:

  • NetworkTransform перемещает персонажа в любую позицию команд хоста.
  • NetworkAnimator синхронизирует анимационные переменные и воспроизводит анимационные клипы в соответствии с указаниями хоста, в то время как эти анимационные клипы также применяют корневое движение.

Результат точный (имеется в виду, что персонаж достигает точного целевого назначения), но очень запинающийся ход (заметные прыжки).

При удалении NetworkTransform экземпляры символов хоста и клиента десинхронизируются очень быстро, что означает, что они окажутся на разных позициях в мире, когда будут управляться исключительно аниматором, зависящим от времени.

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

Я пытался сохранить оба компонента при отключении корневого движения для аниматора (только на клиенте). В этом случае, однако, NetworkTransform, кажется, не интерполирует вообще. Персонаж просто переходит из синхронизированной позиции в синхронизированную позицию с шагом около 0,02 единиц. То же самое с вращением.

NetworkTransform настроен на "Синхронное преобразование", так как у символа нет ни RigidBody, ни CharacterController. Все остальные значения являются значениями по умолчанию: частота синхронизации 9 (также пробовали более высокие значения там), порог движения 0,001, порог привязки 5, движение интерполяции = 1.

Как я могу получить свободное движение на основе корневого движения в сети? Я ожидал, что это будет стандартный сценарий...

1 ответ

Вам нужно отключить флаг Root Motion на нелокальных экземплярах, а также интерполировать вращение, а не только движение.

Более того, интерполяция 1 кажется высокой, как и порог 5: они кажутся нереальными, если вы не используете стандарт Unity, где 1 единица = 1 метр. У меня была бы 25см (0,25) интерполяция для движения и 3 градуса для вращения. Частота синхронизации 9 может быть достаточно, но по моему опыту она должна быть пересчитана на основе потери пакетов.

Другие вопросы по тегам