Интерполяция: запустить сравнение On и Off
Один полный C#-файл для Entity2D: одинаковое физическое движение с разной плавностью картинки.
Подготовить проект
В Project Settings включите physics/common/physics_interpolation. Для наглядного сравнения временно задайте physics/common/physics_ticks_per_second = 10, затем верните рабочую частоту проекта. Рендер должен выдавать заметно больше 10 кадров/с. Окно — 640×420 или больше.
Создайте отдельный уровень с корнем Entity2D, добавьте InterpolationDemo2D.cs, прикрепите его к корню, соберите и запустите F6. Не двигайте корень и не меняйте его масштаб. Внешние ресурсы не нужны. Синий квадрат использует On, белый Off; оба получают одну физическую X-координату. Сравните их движение, затем отключите глобальную настройку и повторите запуск: локальный On не должен восприниматься как независимая глобальная система.
InterpolationDemo2D.cs
using System;
using Reckfell;
public partial class InterpolationDemo2D : Entity2D
{
public Entity2D Smooth { get; private set; } = null!;
public Entity2D Stepped { get; private set; } = null!;
public float Speed { get; set; } = 120;
public int Warps { get; private set; }
private float _x = 80;
private float? _warp;
public override void _Ready()
{
Smooth = Marker(new Vector2(_x,120),new Color(.25f,.45f,1),PhysicsInterpolationModeEnum.On);
Stepped = Marker(new Vector2(_x,260),Colors.White,PhysicsInterpolationModeEnum.Off);
AddChild(new Label { Text = "On", Position = new Vector2(24,56), Modulate = new Color(.6f,.6f,.6f) });
AddChild(new Label { Text = "Off", Position = new Vector2(24,196), Modulate = new Color(.6f,.6f,.6f) });
ResetPhysicsInterpolation();
}
private Entity2D Marker(Vector2 position,Color color,PhysicsInterpolationModeEnum mode)
{
var marker = new Entity2D { Position = position, PhysicsInterpolationMode = mode };
marker.AddChild(new Polygon2D { Polygon = new[] { new Vector2(-12,-12),new Vector2(12,-12),new Vector2(12,12),new Vector2(-12,12) }, Color = color });
AddChild(marker); return marker;
}
public void RequestWarp(float x)
{
if (!float.IsFinite(x)) throw new ArgumentOutOfRangeException(nameof(x));
_warp = x;
}
public override void _PhysicsProcess(double delta)
{
bool reset = _warp.HasValue;
_x = _warp ?? (_x + Speed * (float)delta); _warp = null;
if (_x > 560) { _x = 80; reset = true; }
Smooth.Position = new Vector2(_x,120); Stepped.Position = new Vector2(_x,260);
if (reset) { ResetPhysicsInterpolation(); Warps++; }
}
}Что делает код
Движение идёт только в _PhysicsProcess. Скорость 120 пикселей/с умножается на delta, потому что здесь изменяется Position напрямую, а не вызывается MoveAndSlide. После перехода за правую границу код переносит оба объекта и сбрасывает историю. RequestWarp задаёт перенос для следующего физического шага; обычное непрерывное движение не вызывает ResetPhysicsInterpolation каждый кадр.
Если различия нет, проверьте глобальную настройку, фактические FPS, режимы сущностей и отсутствие второго скрипта, который пишет Position в _Process. Если нет рисунка — тип корня, успешную C#-сборку, размер viewport и расположение камеры/Canvas в вашем проекте. Перед выпуском проверьте подключение к реальной иерархии.