I am building a tilt type game based on the Roller Ball tutorial. I have a camera which "smooth" follows the ball. My problem is tilting of the phone is linked to the stage not the camera. If the camera rotates 180 around the ball the tilt controls are opposite, tilt left and the ball moves to the right. The tilt doesn't update with the camera. This makes control of the ball imposable.
How can I have the tilting linked to the camera view and not the scene.
Here is the code
public var force:float = 1.0;
public var simulateAccelerometer:boolean = false;
function FixedUpdate () {
print camera.transform.rotation();
var dir : Vector3 = Vector3.zero;
if (simulateAccelerometer)
{
// using joystick input instead of iPhone accelerometer
dir.x = Input.GetAxis("Horizontal");
dir.z = Input.GetAxis("Vertical");
}
else
{
// we assume that device is held parallel to the ground
// and Home button is in the right hand
// remap device acceleration axis to game coordinates
// 1) XY plane of the device is mapped onto XZ plane
// 2) rotated 90 degrees around Y axis
dir.x = -Input.acceleration.y;
dir.z = Input.acceleration.x;
// clamp acceleration vector to unit sphere
if (dir.sqrMagnitude > 1)
dir.Normalize();
}
rigidbody.AddForce(dir * force);
}
Try to transform the input direction relative to the camera:
dir = Camera.main.transform.TransformDirection(dir);
rigidbody.AddForce(dir * force);
Alternatively if you want to ignore any height slope:
var lookAt = transform.position - Camera.main.transform.position;
lookAt.y = 0;
var rotation = Quaternion.LookRotation(lookAt);
rigidbody.AddForce(rotation * dir * force);
// Complete test script that I successfully tested with.
var force = 5.0f;
function FixedUpdate () {
var dir : Vector3 = Vector3.zero;
dir.x = Input.GetAxis("Horizontal");
dir.z = Input.GetAxis("Vertical");
var lookAt = transform.position - Camera.main.transform.position;
lookAt.y = 0;
var rotation = Quaternion.LookRotation(lookAt);
rigidbody.AddForce(rotation * dir * force);
}