- Home /
Character won't jump under certain circumstances
There are 2 situations in which the character won't jump. 1 is when 2 of the WASD keys are pressed. The other is when walking downhill.
My code:
using UnityEngine;
using System.Collections;
public class PlayerController : MonoBehaviour {
public float speed;
private float mouseX;
private float mouseY;
public float xSensitiv;
public float ySensitiv;
public float jumpForce;
private float yVelocity;
private Vector3 [] jumpDirection = new Vector3 [4];
void FixedUpdate () {
if (Input.GetKey (KeyCode.W))
{
GetComponent <CharacterController> ().Move (transform.forward * speed * Time.deltaTime);
}
if (Input.GetKey (KeyCode.A))
{
GetComponent <CharacterController> ().Move (-transform.right * speed * Time.deltaTime);
}
if (Input.GetKey (KeyCode.S))
{
GetComponent <CharacterController> ().Move (-transform.forward * speed * Time.deltaTime);
}
if (Input.GetKey (KeyCode.D))
{
GetComponent <CharacterController> ().Move (transform.right * speed * Time.deltaTime);
}
mouseX += Input.GetAxis ("Mouse X") * xSensitiv * Time.deltaTime;
transform.rotation = Quaternion.Euler (0, mouseX, 0);
mouseY -= Input.GetAxis ("Mouse Y") * ySensitiv * Time.deltaTime;
mouseY = Mathf.Clamp (mouseY, -90, 90);
Camera.main.transform.localRotation = Quaternion.Euler (mouseY, 0, 0);
if (GetComponent <CharacterController> ().isGrounded == true)
{
if (Input.GetKey (KeyCode.Space))
{
yVelocity = jumpForce;
}
}
else
{
yVelocity += Physics.gravity.y * Time.deltaTime;
}
GetComponent <CharacterController> ().Move (Vector3.up * yVelocity);
}
}
@InvincibleCat I thought I'd update you on my progress. I have a working jump and moving. These are now my only problems :)
Related: Try to move the CharController down by a small amount before checking IsGrounded. Something like this:
// move 0.1f down
transform.position -= Vector3.up * 0.1f;
if(GetComponent<CharacterController>().IsGrounded && Input.Get$$anonymous$$eyDown($$anonymous$$eyCode.Space))
{
yVelocity = jumpForce;
}
else
{
yVelocity += Physics.gravity.y * Time.deltaTime;
}
// add 0.1f to y-$$anonymous$$ovement
GetComponent<CharacterController>().$$anonymous$$ove(Vector3.up * (yVelocity + 0.1f));
Unrelated I: You could do your if(...Get$$anonymous$$ey(...)) in 1-2 lines:
Vector3 movement = Input.GetAxis("Horizontal") * transform.right + Input.GetAxis("Vertical") * transform.forward;
GetComponent<CharacterController>().$$anonymous$$ove(movement * speed * Time.deltaTime);
Unrelated II: You should store a Reference to your CharacterController. Calling GetComponent often is not the best choice performance-wise (It queries the GameObject's Components until it finds a suitable Component, can be quite slow depending on number of Components and their order). Either get a Reference to your CharacterController (as a local variable) once per FixedUpdate or create a member of type CharacterController in your class and get a reference in Start() (or at the first possible time when you can be sure your CharacterController has been created)
And what about the not being able to move if 2 wasd keys are pressed? By the way good answer, thanks for finding this
Your answer
Follow this Question
Related Questions
Unusual normalized vector effects on movement 1 Answer
Help with implementing continuous collision detection 0 Answers
Strange Character Controller Behavior Caused by Simulated Gravity and Ground Check 0 Answers
How Time.deltaTime affects movement ? 4 Answers
2D Character suddenly stops moving for no given reason 1 Answer