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

@@ -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.