- Home /
[SOLVED] 2D Character Controller gains velocity when colliding with a corner
So I've followed along with Mike Geig's 2D Character Controller (https://www.youtube.com/watch?v=Xnyb2f6Qqzg) and I've found that if you encounter a corner it launches you into the air. I originally thought that it was due to the player holding down the jump button, but after adding measures to prevent jumping more than once while the button is held it still happens. Anyone else have this issue or has had it?
Here is an example of the issue. You can see a regular jump, but then when the character jumps near the corner it just adds on a lot more velocity.
Here is the movement and jump code I'm using:
void MovePlayer ()
{
float moveX = Input.GetAxis ("Horizontal");
grounded = Physics2D.OverlapCircle (groundCheck.position, groundRadius, whatIsGround);
touchingWall = Physics2D.OverlapCircle (wallCheck.position, wallRadius, whatIsGround);
animator.SetBool ("Ground", grounded);
rigidBody.velocity = new Vector2 (moveX * maxSpeedX, rigidBody.velocity.y);
animator.SetFloat ("Speed", Mathf.Abs (moveX));
// Flips the player left and right
if (moveX > 0 && !facingRight) {
Flip ();
} else if (moveX < 0 && facingRight) {
Flip ();
}
}
void Jump () {
if (grounded && Input.GetAxis ("Jump") > 0.01f && canJumpAgain) {
lastXVelocity = rigidBody.velocity.x;
canJumpAgain = false;
animator.SetBool ("Ground", false);
//rigidBody.velocity = new Vector2 (0, 0);
//rigidBody.AddForce (new Vector2 (0, jumpSpeed), ForceMode2D.Force);
rigidBody.velocity = new Vector2 (lastXVelocity, jumpSpeed * Input.GetAxis ("Jump"));
}
if (rigidBody.velocity.y < 0) {
rigidBody.velocity += Vector2.up * Physics2D.gravity.y * (fallMultiplier - 1) * Time.deltaTime;
}
else if (rigidBody.velocity.y > 0 && !Input.GetButton ("Jump")) {
rigidBody.velocity += Vector2.up * Physics2D.gravity.y * (lowJumpMultiplier - 1) * Time.deltaTime;
}
if (Input.GetAxis ("Jump") == 0f) {
canJumpAgain = true;
}
}
Any help would be appreciated! Thanks!
Answer by ReevesPro · Jan 02, 2018 at 03:10 AM
I ended up using AddForce in both the MovePlayer() and Jump() functions instead of velocity. This way I can only apply force when needed. Also I bumped up the Linear Drag by 10 to stop the player from sliding.
Here is my code now:
if (Input.GetAxis ("Horizontal") != 0) {
rigidBody.AddForce (new Vector2 (moveX * maxSpeedX, 0));
} else {
rigidBody.velocity = new Vector2 (0, rigidBody.velocity.y);
}
animator.SetFloat ("Speed", Mathf.Abs (moveX));
// Flips the player left and right
if (moveX > 0 && !facingRight) {
Flip ();
} else if (moveX < 0 && facingRight) {
Flip ();
}
}
void Jump () {
if (grounded && Input.GetAxis ("Jump") > 0.01f && canJumpAgain) {
canJumpAgain = false;
animator.SetBool ("Ground", false);
rigidBody.AddForce (new Vector2 (0, jumpSpeed));
}
if (rigidBody.velocity.y < 0) {
rigidBody.velocity += Vector2.up * Physics2D.gravity.y * (fallMultiplier - 1) * Time.deltaTime;
}
else if (rigidBody.velocity.y > 0 && !Input.GetButton ("Jump")) {
rigidBody.velocity += Vector2.up * Physics2D.gravity.y * (lowJumpMultiplier - 1) * Time.deltaTime;
}
if (Input.GetAxis ("Jump") == 0f) {
canJumpAgain = true;
}
}
Hope this helps anyone else who runs into this issue.