I’m currently trying to detect whether my player is on ground, but sadly my method means if the player contacts anything, he can jump again, and i really only wish that if the player is colliding/against floor then it can jump again.
so far, i’ve been using the very basic:
var isFalling : boolean=true;
function Update () {
if(Input.GetKeyDown("space") && !isFalling){
rigidbody.velocity.y=20;
}
function OnCollisionStay(collisionInfo : Collision) {
isFalling=false;
}
Any ideas would be grealty appreciated, i’ve considered raycasting, but i await your more talented direction 
I prefer to use a raycast. In this answer the character is a rigidbody that rotates and moves with WASD, jumps with Space and uses the raycast to determine if it’s grounded.
EDITED: If you want to use a sphere, several things must be changed. You can’t rely on local references like transform.up, right or forward, so you will need an auxiliar direction indicator. The script below uses dirAngle to define the direction, and rotate this angle with AD. I have not tested this; let me know if something goes wrong:
var speed : float = 8.0;
var jumpSpeed : float = 9.0;
var turnSpeed : float = 90;
private var dirAngle: float = 0; // direction the ball is currently facing
private var moveDirection: Vector3 = Vector3.zero;
private var distGround: float;
private var isGrounded: boolean = false;
function Start(){
var ball: SphereCollider = transform.collider;
distGround = ball.radius; // distance to ground
}
function Update(){
var hit: RaycastHit; // use raycast to check if character grounded (0.1m tolerance)
isGrounded = Physics.Raycast(transform.position, -Vector3.up, distGround + 0.1);
if (isGrounded && Input.GetButtonDown("Jump")){ // only jump from the ground
rigidbody.velocity.y += jumpSpeed;
}
// update direction angle and use it to rotate vector3.forward
dirAngle = (dirAngle + Input.GetAxis("Horizontal")*turnSpeed*Time.deltaTime) % 360;
moveDirection = Vector3.forward * Input.GetAxis("Vertical") * speed;
moveDirection = Quaternion.Euler(0, dirAngle, 0) * moveDirection;
}
function FixedUpdate(){ // move at FixedUpdate to get stable results
transform.Translate(moveDirection * Time.deltaTime, Space.World);
}