Свободное движение с 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 может быть достаточно, но по моему опыту она должна быть пересчитана на основе потери пакетов.