언리얼 Chaos Vehicle이 멈추지 않고 후진할 때: bReverseAsBrake와 상태 머신 이해

자율주행 차량이 도로 끝에 도달했을 때 멈추지 않고 건물에 박는 문제를 해결하는 과정에서, 언리얼 5 Chaos Vehicle의 동작 모델을 이해하지 않으면 단순 입력 명령으로는 완전 정지가 어렵다는 걸 알게 됐다.

브레이크를 걸어도 멈추지 않는다

처음에는 가속을 떼고 후미등을 켜면 멈출 줄 알았다.

하지만 알고 보니 후미등을 켜는 함수는 실제 제동과 무관했다.

함수 이름만 보고 동작을 짐작하면 안 되고, 실제 구현을 봐야 정확한 동작을 알 수 있다는 걸 먼저 확인한 지점이다.

실제 브레이크 입력을 100%로 걸어도 관성 때문에 도로 끝을 5~10m 지나쳐 멈췄다.

그래서 도로 끝에 가까워지면 미리 감속하는 로직을 UpdateTargetSpeed에 넣었다.

if (Spline && !Spline->IsClosedLoop())
{
    const float Remaining = Spline->GetSplineLength() - CurrentDistance;
    if (Remaining < EndApproachDistance)
    {
        const float Ratio = FMath::Clamp(Remaining / EndApproachDistance, 0.f, 1.f);
        const float EndSpeedLimit = MaxSpeed * Ratio;
        SpeedLimit = FMath::Min(SpeedLimit, EndSpeedLimit);
    }
}

 

여기서 한 가지 배운 점은, 남은 거리에 따라 줄일 목표 속도를 MinSpeed까지가 아니라 0까지 내려가도록 해야 한다는 것이다. MinSpeed를 하한으로 두면 차량이 그 속도를 유지하려고 계속 움직인다.

로그를 찍고 나서야 보인 진짜 원인

미리 감속을 넣었는데도 차량이 정지 후 거꾸로 도로를 따라 후진했다.

추측을 멈추고 매 프레임 상태를 로그로 찍었다.

Tick: completed=1, dist=310658.2, speed=2685
Tick: completed=1, dist=310658.2, speed=2686
Tick: completed=1, dist=310658.2, speed=2687

 

정지 상태로 진입했고 위치는 고정인데 속도가 계속 증가했다.

브레이크를 거는데 속도가 오히려 늘어난다는 것은 차량이 능동적으로 움직이고 있다는 뜻이었다.

추측만 했다면 계속 브레이크 강도만 만지고 있었을 것이다.

원인: Chaos Vehicle의 상태 머신

언리얼 5의 Chaos Vehicle은 자체 상태 머신을 가진다.

차량이 거의 정지한 상태에서 브레이크 입력이 계속 들어오면, 이를 후진 의도로 해석해 자동으로 후진 기어로 전환한다.

차량 폰의 제동 함수는 단순히 브레이크 입력만 거는데, Chaos 내부 로직이 "정지 상태 + 지속 브레이크 = 후진"으로 판단한 것이다.

물리 속도를 매 프레임 0으로 강제해도 다음 프레임에 Chaos가 다시 후진을 시도했다.

입력 레벨에서 제어하는 것의 한계였다.

해결: 동작 모델에 맞는 설정 변경

이 동작을 결정하는 것은 ChaosVehicleMovement 컴포넌트의 bReverseAsBrake 값이었다.

  • true (아케이드 모드): 브레이크를 계속 누르면 정지 후 자동 후진
  • false (시뮬레이터 모드): 브레이크는 제동 역할만 수행

bReverseAsBrake를 false로 바꾸자, 별도의 물리 차단 같은 우회 없이 일반적인 브레이크 입력만으로 정상 정지했다.

이 프로젝트에서 얻은 정리는, 특정 엔진 시스템을 다룰 때는 "브레이크 = 정지" 같은 일반적 직관이 그대로 통하지 않을 수 있다는 것이다.

Chaos Vehicle처럼 자체 상태 머신이 있는 시스템은 그 동작 모델을 먼저 이해해야 입력 명령이 의도대로 작동한다.

우회책을 쌓기 전에 시스템이 입력을 어떻게 해석하는지부터 확인하는 편이 결과적으로 빨랐다.

+ Recent posts