Rigidbody movement

Hello! I have been making own Rigidbody movement script, and i have a problem. My game is 2d and it have air acceleration. And the problem is player can climb on walls because air acceleration can stay it on the wall. And player is able jump up walls forever. So how i can stop it? Here is code:

var speed = 10.0;
var gravity = 10.0;
var maxVelocityChange = 10.0;
var canJump = true;
var jumpHeight = 2.0;
var airspeed = 8.0;
private var truespeed = 0.0;
private var grounded = false;
 
@script RequireComponent(Rigidbody, CapsuleCollider)
 
function Awake ()
{
	rigidbody.freezeRotation = true;
	rigidbody.useGravity = false;
}
 
function FixedUpdate ()
{

	// Calculate how fast we should be moving
		var targetVelocity = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
		targetVelocity = transform.TransformDirection(targetVelocity);
		targetVelocity *= truespeed;
 
		// Apply a force that attempts to reach our target velocity
		var velocity = rigidbody.velocity;
		var velocityChange = (targetVelocity - velocity);
		velocityChange.x = Mathf.Clamp(velocityChange.x, -maxVelocityChange, maxVelocityChange);
		velocityChange.z = Mathf.Clamp(velocityChange.z, -maxVelocityChange, maxVelocityChange);
		velocityChange.y = 0;
		rigidbody.AddForce(velocityChange, ForceMode.VelocityChange);
	
	if(grounded == false){
		truespeed = airspeed;
 	
	}
	if (grounded == true)
	{
		truespeed = speed;
		
		// Jump
		if (canJump && Input.GetButton("Jump"))
		{
			rigidbody.velocity = Vector3(velocity.x, CalculateJumpVerticalSpeed(), velocity.z);
		}
	}
 
	// We apply gravity manually for more tuning control
	rigidbody.AddForce(Vector3 (0, -gravity * rigidbody.mass, 0));
 
	grounded = false;
}
 
function OnCollisionStay (hit : Collision)
{
	grounded = true;	
	if(hit.gameObject.tag == "friction"){
         transform.parent = hit.transform ; 
     }else{
         transform.parent = null;
 }
}
 
function CalculateJumpVerticalSpeed ()
{
	// From the jump height and gravity we deduce the upwards speed 
	// for the character to reach at the apex.
	return Mathf.Sqrt(2 * jumpHeight * gravity);
}

By any chance have you forgotten to set the Physics Materials of each of your Colliders? I often find odd effects happening when I’ve not done this.

To test whether this is the case, try applying a new Physics Material with all values set to 0 to each of the Colliders in the scene.

Of course, it could easily be something else, but if this is the case then it’s a quick fix.