- Home /
2D Wall-Jump, preventing jumps/sticking on the same wall.
Hey everybody,
I am making a simple 2D-Platformer since i just started learning unity and coding all together. I've got the wall jump and everything working fine, the problem is that the player can climb walls by just jumping up on the same wall over and over again. i do not want that.
i tried storing the x-position of the last performed wall-jump, which worked well in theory. but there seem to be little inaccuracies in the position. that means: preventing the wall-jump that way, only works in 1 out 10 cases or so. is there a way to add some sort of margin or tolerance to it? I couldn't find anything on google, for the life of me.
Thank you all in advance.
Here is the code, in case it helps.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
[SerializeField] private float moveSpeed;
[SerializeField] private float jumpSpeed;
[SerializeField] private LayerMask groundLayer;
[SerializeField] private LayerMask wallLayer;
private Rigidbody2D body;
private Animator anim;
private BoxCollider2D boxCollider;
private float wallJumpCooldown;
private float horizontalInput;
private bool canWallJump = true;
private float lastWallJump;
private void Awake()
{ //get references
body = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
boxCollider = GetComponent<BoxCollider2D>();
}
private void Update()
{
horizontalInput = Input.GetAxis("Horizontal");
//FLip player left/right
if (horizontalInput > 0.01f){
transform.localScale = Vector3.one;
}
else if (horizontalInput < -0.01f){
transform.localScale = new Vector3(-1, 1, 1);
}
//Wall Jump logic
if (wallJumpCooldown > 0.2f)
{
body.velocity = new Vector2(horizontalInput * moveSpeed, body.velocity.y);
if (onWall() && !isGrounded()){
body.gravityScale = 2.5f;
body.velocity = body.velocity / 1.05f;
}
else{
body.gravityScale = 3;
}
if (Input.GetKeyDown(KeyCode.Space)){
Jump();
}
}
else
{
wallJumpCooldown += Time.deltaTime;
}
//check if running/jumping
anim.SetBool("Run", horizontalInput != 0);
anim.SetBool("Grounded", isGrounded());
anim.SetBool("onWall", onWall() && !isGrounded());
}
//Jump Function
private void Jump(){
if (isGrounded())
{
body.velocity=new Vector2(body.velocity.x, jumpSpeed);
anim.SetTrigger("Jump");
}
else if (onWall() && !isGrounded() && canWallJump && lastWallJump != gameObject.transform.position.x)
{
body.velocity = new Vector2 (-Mathf.Sign(transform.localScale.x) , jumpSpeed * 1.1f);
wallJumpCooldown = 0;
StartCoroutine(WallJump());
lastWallJump = gameObject.transform.position.x;
}
}
//Ground/wall Checks
private bool isGrounded(){
RaycastHit2D raycastHit = Physics2D.BoxCast(boxCollider.bounds.center, new Vector2 (0.2f, boxCollider.size.y), 0, Vector2.down, 0.1f, groundLayer);
return raycastHit.collider != null;
}
private bool onWall(){
RaycastHit2D raycastHit = Physics2D.BoxCast(new Vector2(boxCollider.transform.localPosition.x, boxCollider.transform.localPosition.y +1.2f), new Vector2(0.5f, 0.1f), 0, new Vector2(transform.localScale.x, 0), 0.1f, groundLayer);
return raycastHit.collider != null;
}
public bool canAttack(){
return !onWall();
}
//Walljump Cooldown
IEnumerator WallJump(){
canWallJump = false;
yield return new WaitForSeconds(0.4f);
canWallJump = true;
}
}
Your answer
Follow this Question
Related Questions
I cant get wall jumping to work in my 2D platformer (C#) 1 Answer
2D Wall Jump Problem 0 Answers
Wall jump push force 1 Answer