Well the procedural generation stuff has changed and isn’t great. But, parkour works better now!
I just moved my parkour platforming code over from blueprint to C++, which I do recommend using blueprint for rapid prototyping, I think C++ gives superior control over things and is really where you should ultimately go.
So I started with the C++ FPS template (which extends the ACharacter class), and then extending the Character Movement Component.
What I mean by “parkour” at this moment is specifically wallrunning (both vertical and horizontal - plus the ability to jump while wallrunning) and a simple version of what I’m calling “ledge vaulting” (similar to ledge hanging, but instead of hanging, the character throws themselves onto the platform rapidly instead of just hanging there.) I’ve accomplished these things by extending
virtual void ACharacter::MoveBlockedBy(const FHitResult& Impact) override;
void ACharacter::Landed(const FHitResult& Hit);
void UCharacterMovementComponent::OnMovementModeChanged(EMovementMode PreviousMovementMode, uint8 PreviousCustomMode);
virtual void UCharacterMovementComponent::PhysFalling(float deltaTime, int32 Iterations);
MoveBlockedBy() and PhysFalling() are the important ones. MoveBlockedBy seems to be called whenever your velocity is decreased because you’re colliding with something (usually a wall) crucially, it is called regardless of your movement mode (for some reason I thought it’d only be called when you’re walking - I needed it when “falling” so it worked out.) I detect the edges using code inspired by something I saw somewhere on these forums, it does a line trace starting from a point 600cm above and 42.01cm in front of the character and sends it downwards. If it finds a platform, it does another line trace, this time from the character to a point just above the platform, to see if the character can reach the point, then if that works it launches the character towards the point (presently I’m actually using the SafeMoveUpdatedComponent function to move the character, but I haven’t the foggiest idea if that’s actually a good way to go about it - I’m guessing not, but it works for now.)