# How do I make a Rigidbody 3D wall jump?

So I’ve made a simple third person parkour script, and want to implement wall jumping, and I’m not sure how to go about doing it.
Here’s how I detect wall collision:

void OnCollisionEnter(Collision collision)

`````` foreach (ContactPoint contact in collision.contacts)
{
if (!onGround && rb.position.y > -16f)
{
Debug.DrawRay(contact.point, contact.normal, Color.red, 10f);
}
}
``````

And heres my movement script:

void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && onGround == true)
{
speed = jumpSpeed;
onGround = false;
}
}

``````void FixedUpdate()
{
moving = Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.D);

if (moving)
{
transform.rotation = Quaternion.Euler(0, Camera.rotation.eulerAngles.y, 0);
}

float x = Input.GetAxisRaw("Horizontal");
float y = Input.GetAxisRaw("Vertical");

Vector3 move = (transform.right * x + transform.forward * y);
move.Normalize();
rb.velocity = new Vector3(move.x * speed * Time.deltaTime, rb.velocity.y, move.z * speed * Time.deltaTime);

onGround = Physics.CheckSphere(new Vector3(transform.position.x, transform.position.y - 1, transform.position.z), spSize, Ground);
}
``````

Any answers would be greatly appreciated, sorry if this is a stupid question I’m pretty new to Unity.

The way I implemented wall jumping was using a rigidbody controller, which I can see you’re also using.

# Wall Jumping

###Detecting Walls###
So the way I detected if the player is near a wall, and able to wall-jump, was by using a separate trigger collider, slightly larger than the player’s collider. The script would run as follows:

``````    private void OnTriggerStay(Collider other)
{
if (!IsGrounded)
IsNearWall = true;
else
IsNearWall = false;
}

private void OnTriggerExit(Collider other)
{
IsNearWall = false;
}
``````

This uses the `OnTriggerStay ` method, which would detect if a wall enters the player’s trigger collider, and while it is in the trigger, allow wall jumping, through the bool `IsNearWall`.
There is also a check for ground, because if the player is stationary and near a wall, you wouldn’t want them to wall jump.

###How To Jump Off Walls###
Jumping off walls work by adding a force to the rigidbody, in the direction of the wall’s normal. This is the direction that the wall is facing, essentially. You can get this, using a raycast, which is what the code below does.

``````    private void WallJumpCheck()
{
// If jump button is pressed on a wall
if (Input.GetKeyDown(KeyCode.Space) && IsNearWall)
{
// Get the forward, backward, left and right directions of the player
// NOTE: some directions not necessary if your player can only jump on
// some of the directions in the array
Vector3[] Directions = new Vector3[]
{
transform.forward,
transform.forward,
transform.right,
-transform.right
};

foreach (Vector3 direction in Directions)
{
// Fire a small raycast out of the player to the wall in the given direction
if (Physics.Raycast(transform.position, direction, out RaycastHit hit, 1f))
{
// Add a force to the player in the direction of the wall's normal
rb.AddForce(hit.normal * JumpForce * Time.deltaTime, ForceMode.Impulse);

break;
}
}
}
}
``````

There’s a lot of code comments in there, so it should be clear how it works. Just a simple raycast in the player’s sides and forward directions, trying to find the wall’s normal, and adding force.

NOTE: This would be problematic, if the player is in a corner, where there are two walls, and the player might not know which wall normal to get.

I hope this gives you some insight into one way of implementing a wall jump. I would love to see how far you get! @RandumbGuy