Why shouldn't I use built-in CharacterController.isGrounded?

I am trying to make a third person movement system with Character Controller for the first time. I followed some tutorials here and there, and I noticed that for jumping, gravity and so on, when controller.isGrounded is needed, almost everyone uses Physics.checkSphere and keeps track of their own isGrounded variable. When I tried to use the built-in isGrounded and it had some issues, since the player was not laying exactly on the ground after a jump apparently, even if I tried to apply a small amount of gravity even if the player is grounded, just to make sure it was completely in the right position.
Now, what I don’t understand is: what is isGrounded used for, if it does not work for this kinda simple task?

It works, within its limitations. The sample code Unity provided was broken and I fixed it. Humorously it looks like they removed their broken code example rather than provide a fixed one. Sigh!

Here is my discussion and my corrected code work-around:

The key is what the .isGrounded thing actually specifies, and this was what Unity’s sample code completely ignored:

.isGrounded : “Was the CharacterController touching the ground during the last move?”

Their broken code example called .Move() twice in one frame.

thanks, I’ll check this… I didn’t know I wasn’t supposed to call .Move twice, I was doing that!

I think it USED to work actually… because it did work on older versions of Unity.

Unfortunately tons of example CC scripts out there called Move() twice, and all of them broke… at least if they didn’t also check .isGrounded twice.

You’ll also see the dwell timer I added (in lieu of a straight-up boolean) so that you could reliably jump even while sliding down ramps, which cause intermittent ground contact loss. By dwelling it with a timer, as well as zeroing that timer when you hit Jump, because obviously you WANT to leave the ground then.