Чтобы найти скорость, проверьте CharacterController.velocity (это вектор текущей скорости) в момент перехода isGrounded из false в true. Если вдруг вектор оказывается нулевым (откуда мне знать, сам еще не пробывал), то запоминайте CharacterController.velocity за несколько (3-5) кадров в массив, а потом берите самое большое значение.
Чтобы превратить скорость в ускорение, делим полученную скорость на Time.deltaTime в методе Update. Затем умножаем ускорение на собственную массу и вот получается сила, к-ю оказал ваш персонаж на землю при приземлении. Поскольку земля после столкновения с места не сдвинулась, то и земля оказала на персонажа такую же силу.
Анимацию падения нужно воспроизводить прямо в воздухе. Чтобы вычислить скорость воспроизведения анимации (при условии что в момент приземления она должна закончиться), нужно знать расстояние до земли. Я для этого использую испускание лучей по оси Vector.down и измерение длины луча при столкновении. Время, оставшееся до приземления вычисляю по формуле:
float t = Math.Sqrt(h / g); // g = 9,81f
Разумеется, платформа может отдаляться, приближаться, так что луч придется испускать еще неск. раз через определенные промежутки.
Анимацию приземления лучше воспроизводить не при контакте с землей, а за ~0.5 секунд до столкновения.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами