JuniorКодЧастоЕщё не отвечали
Как двигать объект с постоянной скоростью из точки A в точку B?
Внутри Tick актёра двигайте его с постоянной скоростью из текущей позиции к PointB, останавливаясь точно по прибытии.
Ограничения:
- Используйте нормализованное направление, чтобы скорость не зависела от расстояния A→B.
- Умножайте покадровый шаг на
DeltaTime, чтобы скорость не зависела от FPS. - Ограничьте последний шаг оставшимся расстоянием — встаньте ровно на
PointB, без overshoot.
void AMover::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
// ваш код здесь
}
Допишите реализацию.
Вычислите нормализованное направление (B - A).GetSafeNormal(), затем каждый кадр добавляйте к позиции Direction * Speed * DeltaTime. Умножение на DeltaTime делает скорость независимой от FPS; остановитесь, достигнув цели.
- ✗Забыть
* DeltaTime, из-за чего скорость движения зависит от частоты кадров - ✗Использовать ненормализованное направление — скорость зависит от расстояния до B
- ✗Проскочить B, потому что шаг последнего кадра не ограничен оставшимся расстоянием
- →Как обнаружить и точно встать на B в кадре, который иначе бы проскочил?
- →Чем движение с постоянной скоростью отличается от
VInterpToк B?
Движение с постоянной скоростью
// В заголовке: FVector PointA, PointB; float Speed = 300.0f;
void AMover::BeginPlay()
{
Super::BeginPlay();
PointA = GetActorLocation();
// PointB задаётся извне, например в редакторе
}
void AMover::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
const FVector Current = GetActorLocation();
const FVector ToTarget = PointB - Current;
const float Remaining = ToTarget.Size();
// Шаг этого кадра: скорость × время кадра (независимо от FPS)
const float Step = Speed * DeltaTime;
if (Step >= Remaining)
{
// Иначе проскочили бы цель — встаём точно на B
SetActorLocation(PointB);
SetActorTickEnabled(false);
return;
}
const FVector Direction = ToTarget.GetSafeNormal();
SetActorLocation(Current + Direction * Step);
}
Ключевые моменты:
Directionнормализован, поэтому скорость не зависит от расстоянияA → B.- Умножение на
DeltaTimeдаёт одинаковую скорость при любом FPS. - Последний кадр проверяет
Step >= Remainingи встаёт ровно наB, без overshoot.