- Home /
Stop character from falling/sticking to walls
Hello,
I am trying to make my character hang on a wall but I am facing 2 problems.
First problem is how do I know where my character is hanging at? The bottom, left/right side. I am not sure how to get started with this.
My first thought was to put 3 different colliders and give them a name depending on the side there are on. But not sure if this is a good idea performance wise.
Second problem I encounter is how do I stop the character from falling down? I figured this would be the easy part but I am stuck with it as I can't figure out how to make a rigid body stop falling.
I have no idea how to handle the not falling part. First I tried to set gravity to zero on the object but that doesn't work.
The code so far I have although very trail and error:
public class MovementScript : MonoBehaviour
{
public float maxSpeed = 5f;
public bool startJump = false;
public bool isJumping = false;
public bool isFalling = false;
public float jumpForce = 150f;
//public LayerMask whatIsGround;
public bool hangingOnWall = false;
public bool jumpOffWall = false;
public float jumpDirection;
void Start ()
{
}
void FixedUpdate()
{
float move = Input.GetAxis("Horizontal");
rigidbody2D.velocity = new Vector2 (move * maxSpeed, rigidbody2D.velocity.y);
if(Input.GetButton ("Jump") && (!isFalling && !isJumping ) )
{
startJump = true;
}
if(hangingOnWall && move != 0)
{
jumpOffWall = true;
jumpDirection = move;
}
}
void Update ()
{
if(startJump)
{
rigidbody2D.AddForce(new Vector2(0,jumpForce));
startJump = false;
}
if (rigidbody2D.velocity.y > 0)
{
isJumping = true;
isFalling = false;
}
else if(rigidbody2D.velocity.y < 0)
{
isJumping = false;
isFalling = true;
}
else
{
isJumping = false;
isFalling = false;
}
if(hangingOnWall)
{
}
if(jumpOffWall)
{
rigidbody2D.AddForce(new Vector2(jumpDirection,jumpForce));
jumpOffWall = false;
hangingOnWall = false;
jumpDirection = 0f;
}
}
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.collider.gameObject.layer == LayerMask.NameToLayer("Ground"))
{
Debug.Log("on the ground");
}
if (collision.collider.gameObject.layer == LayerMask.NameToLayer("Walls"))
{
if(rigidbody2D.velocity.x == 0)
{
Debug.Log (rigidbody2D.velocity);
hangingOnWall = true;
}
}
}
}
Thanks in advance!
Answer by Gabriel Saldanha · Feb 20, 2015 at 06:17 PM
Hey there!
1 - About the performance using the colliders: I'm not an expert about that, but I'm pretty sure that 3 colliders is no big deal :) So if you are worried about perfomance, do it!
2 - Handling the 'not falling' part: Why setting the gravity to 0 did not work? It should've. Could you describe what happened? The player kept falling, didn't fall nor jumped off the wall.. Probably there is a logic problem with the flags (isHanging, isFalling, etc.).