- Home /
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...
Answer by DragonSaige · Aug 26, 2012 at 11:14 AM
From the text it appears that you apparently don't have a collider applied to your cube. To do it now, follow these steps.
Select your cube.
Go to Component>Physics>Box Collider.
Also make sure your collider has isTrigger off.
Thank you very much, That worked.. All problems solved...
THank you again...
I figured the problem with my previous cube, i had added rigid body to that cube and froze rotation and disabled gravity for it... That caused the problem... Silly me... Thank yu for ur help
Glad I was helpful, please press the tick mark button against my answer to mark this answer as valid
Answer by BobbleHead · Aug 26, 2012 at 11:35 AM
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.