test(vehicle): the writer is not in the pawn's tick

Sampled the actor transform immediately before and after Super::Tick on every frame: it never changes
there. The 'inside Super::Tick' line never fires, yet the actor climbs 400-1400 cm/s.

With the earlier results that leaves exactly one consistent candidate: the Chaos movement component's own
tick or its async physics step, outside APawn::Tick. That also explains why SetComponentTickEnabled(false)
did not stop the climb and why the body's reported velocity is ~0 while the actor moves - the movement
component is writing a transform it took from a vehicle state that was never created.

Next step is a subclass of UChaosWheeledVehicleMovementComponent that logs UpdateState /
OnUpdateTransform together with the vehicle-state pointer, so the write is caught at its source rather
than inferred from the actor.
This commit is contained in:
zwitschi committed 2026-11-09 21:44:17 +01:00
1 parent 0f059a5c93
commit 348ed1ac69
77 files changed
+95 -76

No files matched your search

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -265,8 +265,27 @@ void AGigLineVehicle::BeginPlay()
void AGigLineVehicle::Tick(float DeltaSeconds)
{
// Which writer moves the actor? Sample the transform before and after the base class tick:
// a change between the two happened inside APawn::Tick (movement component, attachment
// update, animation), a change between this frame's exit and the next frame's entry came
// from somewhere else entirely.
const FVector BeforeSuper = GetActorLocation();
Super::Tick(DeltaSeconds);
const FVector AfterSuper = GetActorLocation();
if (!AfterSuper.Equals(BeforeSuper, 1.0))
{
static float LoggedThisPhase = -1.0f;
if (SettleElapsed - LoggedThisPhase > 0.25f)
{
LoggedThisPhase = SettleElapsed;
UE_LOG(LogTemp, Warning,
TEXT("GigLine vehicle writer: inside Super::Tick %.0f -> %.0f (dz %.0f)"),
BeforeSuper.Z, AfterSuper.Z, AfterSuper.Z - BeforeSuper.Z);
}
}
// One settled-state report: proves the physics body exists, is simulating, and has
// come to rest on the road rather than falling through it. Everything else about the
// driving behaviour is measured later; this is the "is it real" check.