Odd behavior using CharacterController.isGrounded for jumping
I'm at a loss for what's wrong here. Using this tutorial as the basis: https://www.youtube.com/watch?v=-nS1gqSk458
Which references this script: https://docs.unity3d.com/ScriptReference/CharacterController.Move.html
I'm using the "new input system" and I'm trying to add a "Jump" feature.
The problem I'm running into is similar to that in these posts:
https://forum.unity.com/threads/grounded.66133/#post-575193
https://forum.unity.com/threads/controller-isgrounded-doesnt-work-reliably.91436/ 
Ultimately, these posts state that using "playerVelocity.y = 0" when "CharacterController.isGrounded" will not provide the desired results. As I understand it, you have to keep a small amount of gravity pushing the object "into the ground" which will get pushed out automatically because of the colliders.
Now my experience is, I can move around fine, and I can jump... sometimes. Sometimes it's a little hop, sometimes it's the full jump, and still sometimes nothing at all.
Here is my player controller script. Any advice would be greatly appreciated.
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.InputSystem;
 
 public class player : MonoBehaviour
 {
     private CharacterController controller;
     private Vector3 playerVelocity;
     private bool groundedPlayer;
     public float playerSpeed = 2.0f;
     private float jumpHeight = 1.0f;
     private float gravityValue = -9.81f;
     float moveX;
     float moveY;
     float moveZ;
 
     private void Start()
     {
         controller = GetComponent<CharacterController>();
     }
 
     public void OnJump(InputValue value)
     {
         if (controller.isGrounded) {
             // Debug.Log("-----");
             // Debug.Log($"jump start {playerVelocity.y}");
             playerVelocity.y += Mathf.Sqrt(jumpHeight * -3.0f * gravityValue);
             // Debug.Log($"jump to {playerVelocity.y}");
         }
     }
 
     public void OnMove(InputValue value)
     {
         moveX = 0f;
         moveZ = 0f;
 
         var movementInput = value.Get<Vector2>();
 
         moveX = movementInput.x;
         moveZ = movementInput.y;
     }
 
     void Update()
     {
          if (controller.isGrounded)
         {
             playerVelocity.y += 0.001f;
         } else {
              playerVelocity.y += gravityValue * Time.deltaTime;
         }
 
         Vector3 move = new Vector3(moveX, 0, moveZ);
         controller.Move(move * Time.deltaTime * playerSpeed);
 
         if (move != Vector3.zero)
         {
             gameObject.transform.forward = move;
         }
 
         controller.Move(playerVelocity * Time.deltaTime);
     }
 }
Answer by YardGnomeNinja · Jul 20, 2020 at 09:55 PM
If anyone comes across this post, here's the working code.
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.InputSystem;
 
 public class player : MonoBehaviour
 {
     private CharacterController controller;
     private Vector3 playerVelocity;
     private bool groundedPlayer;
     public float playerSpeed = 2.0f;
     private float jumpHeight = 1.0f;
     private float gravityValue = -9.81f;
     float moveX;
     float moveY;
     float moveZ;
 
     private void Start()
     {
         controller = GetComponent<CharacterController>();
     }
 
     public void OnJump(InputValue value)
     {
         if (controller.isGrounded) {
             playerVelocity.y = Mathf.Sqrt(jumpHeight * -3.0f * gravityValue);
         }
     }
 
     public void OnMove(InputValue value)
     {
         moveX = 0f;
         moveZ = 0f;
 
         var movementInput = value.Get<Vector2>();
 
         moveX = movementInput.x;
         moveZ = movementInput.y;
     }
 
     void Update()
     {
         if (controller.isGrounded && playerVelocity.y < 0)
         {
             playerVelocity.y = gravityValue * Time.deltaTime;
         }
         else
         {
             playerVelocity.y += gravityValue * Time.deltaTime;
         }
 
         Vector3 move = new Vector3(moveX, 0, moveZ);
         controller.Move(move * Time.deltaTime * playerSpeed);
 
         if (move != Vector3.zero)
         {
             gameObject.transform.forward = move;
         }
 
         controller.Move(playerVelocity * Time.deltaTime);
     }
 }
 
Ultimately, in order to make it work checking the key input outside of Update, the Move script needed to have this instead...
      if (controller.isGrounded && playerVelocity.y < 0)
      {
          playerVelocity.y = gravityValue * Time.deltaTime;
      }
      else
      {
          playerVelocity.y += gravityValue * Time.deltaTime;
      }
Once I did that, everything... fell into place.
Your answer
 
 
             Follow this Question
Related Questions
Sluggish Gravity with Character Controller 0 Answers
CharacterController doesn't jump properly while moving into platform 0 Answers
Unity Character Falls Slowly 0 Answers
My character's axes are rotated when I get out of vehicle 0 Answers
Hold the jump button to jump higher with CharacterController 1 Answer
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                