Интерполяция в проекте: движение, иерархия и телепорт
Порядок подключения к существующей игре и проверки косвенного движения, анимации и сброса истории.
Подключать по одной ветви
Сначала убедитесь, что физическое движение корректно без сглаживания. Включите глобальную настройку, оставьте нормальную частоту физики и проверьте одну ветвь. Inherit получает режим родителя; On и Off задают локальное решение. Глобальное выключение делает систему неактивной даже при локальном On.
Перенесите физическое движение и изменения его родителей в _PhysicsProcess. Учитывайте косвенные записи: AnimationPlayer/AnimationMixer, Tween, дорожки transform, скрипты камеры и обычного родителя могут двигать объект, даже если его собственный скрипт ничего не меняет. Для физической анимации/Tween выберите подходящий физический режим обработки. Это не требование переносить сетевые запросы, интерфейс и весь код игры в физический callback.
Перенос и создание экземпляра
Правильный порядок телепорта: установить окончательное положение/ориентацию, затем ResetPhysicsInterpolation. Вызов до изменения transform сбросит историю на старом месте. После добавления экземпляра в дерево задайте его финальный transform и сбросьте историю нужной ветви. Вне активного дерева/при выключенной системе сброс не является отложенным обещанием будущей интерполяции.
Для CharacterBody сбрасывайте также нужные скорости и обновляйте состояние контактов новым движением. Для RigidBody используйте _IntegrateForces, как в примере сброса. Вызов ResetPhysicsInterpolation не обнуляет Velocity, таймеры или сетевые буферы. Сам Reset распространяет уведомление по дочерней ветви; у отдельно управляемых ресурсов есть собственные правила.
Рабочий перенос показан в InterpolationDemo2D, InterpolationDemo3D и обоих контроллерах персонажа. В запросе RequestWarp координата применяется в физическом callback, а не немедленно в обработчике ввода.
Частота и диагностика
Временно уменьшите частоту до 10–15 шагов/с, чтобы увидеть ступени и длинный след при ошибочном телепорте. Затем верните рабочую частоту и целевые FPS. Слишком низкая физическая частота меняет качество контактов; сглаживание не восстанавливает потерянные проверки. При проблеме записывайте физическую позицию и экранный результат отдельно, а не ожидайте, что GlobalPosition будет изменяться на каждом кадре.
| Симптом | Проверить |
|---|---|
| Рывки остались | FPS относительно ticks, глобальная настройка, режим ветви, записи transform вне физического шага |
| Видимый пролёт после переноса | Порядок transform → ResetPhysicsInterpolation, правильная ветвь и завершённое добавление в дерево |
| Камера дёргается при гладком объекте | Читает ли она физический или интерполированный transform; не сглаживается ли сама повторно |
| Off-ребёнок всё ещё двигается плавно с родителем | Off не отменяет унаследованное движение родителя; проверьте иерархию/разделение ветвей |
| Картинка гладкая, столкновения неверны | Отдельно исправляйте частоту, фильтры, формы и алгоритм движения |
Включённые debug/settings/physics_interpolation/enable_warnings помогают искать неправильную фазу движения, но отсутствие предупреждения не доказывает корректность всей игры. Проверяйте также паузу, смену уровня, повторное создание, смену родителя и поведение при нескольких физических шагах за кадр.