I’m with @Kolyasisan on Breath Of The Wild. Link is easy to control, and looks pretty good while you’re controlling him. Riding a horse in that game is also fantastic.
BOTW is as much a game about vertical movement as a game about horizontal movement. You spend a lot of time climbing or paragliding. And both are fantastic. Link transitions between states based on what you’re moving him into without a single hitch. Move into a slope, he starts struggling. Move into a wall, he starts climbing. Jump onto the back of a horse, and you’re now riding.
When climbing, you feel completely in control over where you are going, and changes in movement are instantaneous.
Paragliding has a lot of conservation of momentum, but even if you miss a landing due to miscalculating the paraglider movement, it never feels unfair, due to consistent results and a very good camera.
They’ve also nailed the transition from water to flat land and water to climbing, as well as the transition from paragliding to climbing. It’s never awkward - and moving from water to land is awkward in every_single_game.
To achieve something like that, the controller needs to:
- Have easy-to-access data about the geometry around the controller, so scripts can use that to make decisions.
- Have easy-to-access data about current heading, speed, etc, again so scripts can use that to make decisions. This is especially important for eg. the paraglider or swimming
- Have a good way to change between states. This should just be handing being replaced with a different controller gracefully. As an example, it should not be hard to maintain velocity when replacing a paragliding controller with a falling/walking one.
A final note: A good third person character controller needs to always respond to the player’s input as fast as possible. This sometimes means transitioning between animation states in ways that doesn’t look good. The alternative is situations like “I was holding back on the stick, but since my character needed to finish the forwards movement animation, I ran off the cliff in front of me and died”. For some good examples, watch about 2 minutes forwards from this video about Max Paine 3.
The design philosophy of the animator controller is the complete opposite of the correct thing here. Since all transitions happen due to pre-defined transitions, every single transition must be authored. This means that unless you define every possible transition, you get instances where movement feels bad.
This means that the character controller should in no way be hard-coded to assume how it’s going to be animated. Ideally, the packages should ship with examples for how to make them animate with the default Unity setup, as well as root motion, but ditching those things should not be a problem in any way.