How to make a character "stick" to objects/meshes (to rotate around a cylinder or go through a loop)?


I’m working on a spiritual successor to an old racing game from the SNES: Uniracers or Unirally, depending on the region. I made models for the various track pieces, made a model that vaguely looked like a Unicycle (I’m no artist, lol) and started getting to work. One of the first main issues that I noticed that I’ve been putting off is how to have the unicycle “stick” to the track I use. If I get to a quarter pipe or something similar, the unicycle just stops. In the original there were quarter-pipes to launch up, half-pipes to change directions, loops and even a piece of track that you’d rotate along the outside of the cylinder and end up underneath.

Examples from the original game (not my videos, just linked for reference):

0:30 - Two half-pipes in a row
1:48 - Blue/white spin pipe

0:26 - Going around a loop

Right now my temporary/simple/ugly solution is basically just set the default character’s movement mode to Flying, disable input and just let the momentum carry it around. Which mostly works, but every “collision” with the curved track slows it down. Not only that, but this would only specifically work with track pieces where I’m on the “inside” of the curve. If I want to do something where I’d be on the outside, then this would do nothing. I’ve looked at how to accomplish this and everywhere I find answers it’s either to download a plugin that’s usually focused on planetary gravity, to rewrite parts of the engine in C++ (that I’d rather avoid, if possible) or to have a custom everything (pawn/actor/movement/gravity/etc).

Are the only solutions right now to either re-write the default character class in C++ or to create custom everything to handle this? If so, how would one go about doing this with custom pawns/movement/gravity/etc?