This would be a good starting point.
It’s also worth mentioning that while ACharacter has a CapsuleComponent built-in, it doesn’t have to be your root component, or even used at all. You can prevent it from being created by using FPostConstructInitializeProperties’s DoNotCreateDefaultSubobject, as follows:
AQuadrupedCharacter::AQuadrupedCharacter( const class FPostConstructInitializeProperties& PCIP )
: Super( PCIP.DoNotCreateDefaultSubobject(ACharacter::CapsuleComponentName) )
{
}
Of course, you’ll have to put a replacement primitive component of your own as RootComponent in your derived class constructor.
Also, make sure the MovementComponent’s UpdatedComponent points to this new primitive component.
Lastly, and this is the most crippling problem, CharacterMovementComponent makes a lot of assumptions about actually having a single CapsuleComponent, so you likely will have to roll out your own version of CharacterMovementComponent.