Making a sphere move and rotate like a real ball on ground

Im a newbie to unity, so here goes my question…
In the scene, i have 4 objects, a Cube, a sphere, Main Camera And A directional light.
“Mouse Orbit” script(found in wiki unity site) is attached to the Main Camera and its working fine.
Cube is of dimension (50,5,50) and located 30 units below the sphere. I added rigid body to the cube and turned ‘Use Gravity’ OFF.
Finally Sphere with rigid body and ‘use gravity’ ON and the following script is attached to it…
Now the problem is when i run the game, the sphere keeps falling through the cube, but i want it to stay on the cube so that i can move and jump around…
Please Help… Im kinda stuck here…

// speed of the ball
var speed = 5.0;
var radius = 1.0;
private var velocity : Vector3 = Vector3.zero;

 
function Start(){
    transform.localScale = Vector3.one * radius * 2;
    var hit : RaycastHit;
    if(Physics.Linecast(transform.position, transform.position - Vector3.up * 500, hit)){
        transform.position = hit.point + Vector3.up * radius;
    }
    // add a rigidbody if we dont have one.
    if(!rigidbody)
        gameObject.AddComponent(Rigidbody);
    // set the mass according to the radius.
    rigidbody.mass = 100 * radius;
}
 
function FixedUpdate () {
    // let see if our body is on the ground.
    var hit : RaycastHit;
    var isGrounded = Physics.Raycast(transform.position, -Vector3.up, hit, radius * 1.5);
    
    // base movement off of the camera, not the object.
    // reset the camera's X to zero, so that it is always looking horizontally.
    var x = Camera.main.transform.localEulerAngles.x;
    Camera.main.transform.localEulerAngles.x = 0;
    
    // now collect the movement stuff This is generic direction.
    var direction = Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical"));
    
    // prevent the ball from moving faster diagnally
    if(direction.magnitude > 1.0) direction.Normalize();
    
    // If we are grounded, then lets see if we want to jump.
    if(isGrounded && Input.GetKeyDown(KeyCode.Space))
        rigidbody.AddForce(Vector3.up * rigidbody.mass * 500);
    
    // if we arent pressing anything, dont mess with the physics.
    if(direction.magnitude > 0){
        // convert isGrounded into something we can use
        var modifier = isGrounded ? 3.0 : 0.5;
        // lets set the direction according to the camera now.
        direction = Camera.main.transform.TransformDirection(direction) * speed * 2;
        // lets take the downward velocity from the current so that we dont get wierd physics results
        direction.y = rigidbody.velocity.y;
        
        // Now, lets keep track of a velocity.
        // This will let the ball move while we are not pressing anything.
        rigidbody.velocity = Vector3.Lerp(rigidbody.velocity, direction, modifier * Time.deltaTime);
        // Now, lets break the rotation out from the movement.
        var rotation = Vector3(rigidbody.velocity.z,0,-rigidbody.velocity.x) * 20;
        
        
        // Lets add some spin to make the ball move better
        rigidbody.angularVelocity = Vector3.Lerp(rigidbody.angularVelocity, rotation, modifier * Time.deltaTime);
    }
  
    
    // return the camera's x rotation.
    Camera.main.transform.localEulerAngles.x = x;
}

And btw i didnt create this code, i found it in unity forums…

From the text it appears that you apparently don’t have a collider applied to your cube. To do it now, follow these steps.

  1. Select your cube.
  2. Go to Component>Physics>Box Collider.

Also make sure your collider has isTrigger off.

if (Input.GetKey (“right”)) {
rigidbody.AddForce (Vector3.forward * 10);
}

	if (Input.GetKey ("left")) {
		rigidbody.AddForce (-Vector3.forward * 10);
		}
	}

Adding force will give your ball a roll. Perhaps not the best way to go about it, but it’s worked for me in the past.

Just add this code to an update function and apply to a sphere, may need a rigidbody.