I agree with PaleoNeo that Dot Product is by far the best way. I found however there to always be the issue of character rotation, and find that if the character is rotating (say turning around) as you move into the trigger you will get an unexpected result when comparing the characters forward vector or velocity, to the trigger forward vector. The way I fixed is by looking from the triggers perspective, and getting the look vector from the trigger to the character, this removes rotation from the mix and you can easily distinguish using dot product whether to one side or the other.
On BeginOverlap:
BeginVector = (OtherActor->GetActorLocation() - GetActorLocation()).GetSafeNormal2D();
On EndOverlap:
FVector EndVector = (OtherActor->GetActorLocation() - GetActorLocation()).GetSafeNormal2D();
float DotProduct = EndVector | BeginVector;
Then simply {using psuedo code}
if (DotProduct < 0.0f) { character is moving same direction as that entered, i.e. gone left to right, do X; }
if (DotProduct >= 0.0f) { character is moving in opposite direction to that entered, i.e. gone left to left, do Y; }
You could do the same in Blueprint easily enough.
NOTE: you can use FVector::DotProduct() rather than the C++ | symbol for dotproduct. I normalized the vectors as I just want direction not magnitude. I also only care about the X & Y axis hence using GetSafeNormal2D(), but you can use GetSafeNormal() which takes into account the Z axis.