Chaos Vehicle 아키텍처
ChaosWheeledVehicleMovementComponent와 차량 물리 시스템 구조
Chaos Vehicle 시스템 개요
PhysX Vehicle에서 Chaos Vehicle로
UE5의 차량 물리는 Chaos Vehicle 시스템을 사용합니다. 이전 PhysX Vehicle을 완전히 대체하며, ChaosVehiclesPlugin을 통해 제공됩니다.
Edit > Plugins > Physics에서 Chaos Vehicles 플러그인이 활성화되어 있는지 확인하세요. UE5에서는 기본적으로 활성화되어 있지만, 프로젝트 설정에 따라 비활성화되어 있을 수 있습니다.
- AWheeledVehiclePawn — 차량 폰의 기본 클래스. Skeletal Mesh + Vehicle Movement Component를 포함합니다.
- UChaosWheeledVehicleMovementComponent — 차량 물리 시뮬레이션의 핵심. 엔진, 변속기, 서스펜션, 타이어를 관리합니다.
- UChaosVehicleWheel — 개별 휠의 물리 속성(반경, 마찰, 서스펜션 등)을 정의합니다.
- FVehicleEngineConfig — 엔진 토크 커브, 최대 RPM 등 엔진 설정.
- FVehicleTransmissionConfig — 기어비, 변속 로직 설정.
Vehicle Pawn 기본 구성
C++에서 차량 폰 만들기
#include "WheeledVehiclePawn.h"
#include "ChaosWheeledVehicleMovementComponent.h"
UCLASS()
class AMyCar : public AWheeledVehiclePawn
{
GENERATED_BODY()
public:
AMyCar();
UPROPERTY(VisibleAnywhere)
USpringArmComponent* SpringArm;
UPROPERTY(VisibleAnywhere)
UCameraComponent* Camera;
virtual void SetupPlayerInputComponent(UInputComponent* InputComponent) override;
private:
void ApplyThrottle(float Value);
void ApplySteering(float Value);
void ApplyBrake(float Value);
void ApplyHandbrake(bool bPressed);
};
AMyCar::AMyCar()
{
// Vehicle Movement Component 접근
UChaosWheeledVehicleMovementComponent* VehicleMovement =
CastChecked<UChaosWheeledVehicleMovementComponent>(GetVehicleMovement());
// 엔진 설정
VehicleMovement->EngineSetup.MaxTorque = 500.0f;
VehicleMovement->EngineSetup.MaxRPM = 7000.0f;
VehicleMovement->EngineSetup.EngineIdleRPM = 1200.0f;
// 변속기 설정
VehicleMovement->TransmissionSetup.bUseAutomaticGears = true;
VehicleMovement->TransmissionSetup.FinalRatio = 3.08f;
// 질량 설정
VehicleMovement->Mass = 1500.0f; // kg
VehicleMovement->InertiaTensorScale = FVector(1, 1, 1);
// 카메라 설정
SpringArm = CreateDefaultSubobject<USpringArmComponent>("SpringArm");
SpringArm->SetupAttachment(RootComponent);
SpringArm->TargetArmLength = 600.0f;
SpringArm->bUsePawnControlRotation = true;
Camera = CreateDefaultSubobject<UCameraComponent>("Camera");
Camera->SetupAttachment(SpringArm);
}
void AMyCar::ApplyThrottle(float Value)
{
GetVehicleMovementComponent()->SetThrottleInput(Value);
}
void AMyCar::ApplySteering(float Value)
{
GetVehicleMovementComponent()->SetSteeringInput(Value);
}
void AMyCar::ApplyHandbrake(bool bPressed)
{
GetVehicleMovementComponent()->SetHandbrakeInput(bPressed);
}
Skeletal Mesh 요구사항
차량 메시 본 구조와 Physics Asset
- Vehicle Root — 차체 본. 모든 휠 본의 부모.
- Wheel_FL / Wheel_FR — 전방 좌/우 휠 본 (조향+구동).
- Wheel_RL / Wheel_RR — 후방 좌/우 휠 본 (구동만).
| 설정 항목 | 설명 | 주의사항 |
|---|---|---|
| Physics Asset | 차체용 단순 콜리전 바디 | 휠 본에는 바디 불필요 (Chaos가 관리) |
| 본 위치 | 휠 본은 실제 접지점 위치에 | 서스펜션 오프셋은 코드에서 설정 |
| 본 방향 | X-Forward, Z-Up 기준 | Import 시 축 확인 필수 |
| 콜리전 | 차체는 간단한 Convex Hull | 복잡한 콜리전은 성능 저하 유발 |
UE5의 Vehicle Template 프로젝트에서 올바른 본 구조와 기본 설정이 포함된 차량을 확인할 수 있습니다. 새 프로젝트를 시작할 때 이 템플릿을 참고하는 것이 가장 빠른 방법입니다.
입력 시스템과 Enhanced Input
Enhanced Input System으로 차량 제어하기
void AMyCar::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
if (UEnhancedInputComponent* EIC =
Cast<UEnhancedInputComponent>(PlayerInputComponent))
{
// Throttle (W/S 또는 트리거)
EIC->BindAction(ThrottleAction, ETriggerEvent::Triggered,
this, &AMyCar::HandleThrottle);
EIC->BindAction(ThrottleAction, ETriggerEvent::Completed,
this, &AMyCar::HandleThrottleRelease);
// Steering (A/D 또는 스틱)
EIC->BindAction(SteerAction, ETriggerEvent::Triggered,
this, &AMyCar::HandleSteering);
EIC->BindAction(SteerAction, ETriggerEvent::Completed,
this, &AMyCar::HandleSteeringRelease);
// Handbrake (Space)
EIC->BindAction(HandbrakeAction, ETriggerEvent::Started,
this, &AMyCar::HandleHandbrakePressed);
EIC->BindAction(HandbrakeAction, ETriggerEvent::Completed,
this, &AMyCar::HandleHandbrakeReleased);
}
}
void AMyCar::HandleThrottle(const FInputActionValue& Value)
{
float ThrottleValue = Value.Get<float>();
GetVehicleMovementComponent()->SetThrottleInput(ThrottleValue);
}
핵심 요약
- UE5 차량 물리는 Chaos Vehicle 시스템 기반이며,
ChaosVehiclesPlugin이 필요합니다. AWheeledVehiclePawn에UChaosWheeledVehicleMovementComponent가 차량 물리를 관리합니다.- Skeletal Mesh에 차체 본 + 4개 휠 본이 필요하며, Physics Asset은 차체만 설정합니다.
SetThrottleInput,SetSteeringInput,SetHandbrakeInput으로 차량을 제어합니다.- Enhanced Input System과의 연동으로 키보드/게임패드/스티어링 휠 지원이 가능합니다.
도전 과제
배운 내용을 직접 실습해보세요
ChaosWheeledVehicleMovementComponent를 사용하여 4륜 차량 블루프린트를 생성하세요. Skeletal Mesh에 휠 본을 설정하고, 기본 스로틀/브레이크/스티어링 입력을 매핑하여 주행 가능한 차량을 만드세요.
Engine Torque Curve를 직접 편집하여 차량의 가속 특성을 변경하세요. 최대 RPM, 기어비, 변속 지점을 조정하며 스포츠카와 트럭의 주행 특성 차이를 구현하세요.
C++로 실시간 차량 텔레메트리 HUD를 제작하세요. RPM, 속도, 기어 단수, 각 휠의 슬립 비율, 서스펜션 압축량을 시각적으로 표시하고, 타이어 접지력 벡터를 3D로 그리세요.