lukewarm take: unreal engine having a robust complex character controller built in is Not Exactly Bad, but also Not Exactly Good
it is nice to not need to think about stuff like "how does it work when i jump from a moving platform" but it gets really, really annoying when you hit the point of "i guess i'll just override this method and then copy and paste all 200 lines from the base class implementation because i need a flag they didn't think of in the middle of it"

eggbug enjoyer