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