- Home /
Camera Following Rigidbody
So, first off, I'm making a game with a player who is essentially a sphere. The game is a 2D side scroller, with two cameras: both following the player, but one focusing on foreground elements that is set to "orthographic", and one that is focused on the background elements set as "perspective". Both have the same script attached to follow the player, but they are not attached to the player in the hierarchy in any way. Also, the player has no gravity; he flies around the level, the limitations being colliders surrounding him.
Now my question: the player is physics based. He has a rigidbody attached and, in order to make the movement smooth and realistic, I use "AddForce" in the player movement script. All is well, except for the fact that there is some noticeable stuttering in either the camera's or player's movement. What I do know, however, is that when I change the rigidbody's interpolation option, I can increase/decrease the stuttering by a bit.
Here I've attached the camera script:
// The target we are following
var target : Transform;
// The distance in the x-z plane to the target
var distance : int;
// the height we want the camera to be above the target
var height = 5.0;
// How much we
var heightDamping = 2.0;
var rotationDamping = 3.0;
// Place the script in the Camera-Control group in the component menu
@script AddComponentMenu("Camera-Control/Smooth Follow")
function LateUpdate () {
// Early out if we don't have a target
if (!target)
return;
// Calculate the current rotation angles
var wantedRotationAngle = target.eulerAngles.y;
var wantedHeight = target.position.y + height;
var currentRotationAngle = transform.eulerAngles.y;
var currentHeight = transform.position.y;
// Damp the rotation around the y-axis
currentRotationAngle = Mathf.LerpAngle (currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime);
// Damp the height
currentHeight = Mathf.Lerp (currentHeight, wantedHeight, heightDamping * Time.deltaTime);
// Convert the angle into a rotation
var currentRotation = Quaternion.Euler (0, currentRotationAngle, 0);
// Set the position of the camera on the x-z plane to:
// distance meters behind the target
transform.position = target.position;
transform.position -= currentRotation * Vector3.forward * distance;
// Set the height of the camera
transform.position.y = currentHeight;
// Always look at the target
transform.LookAt (target);
}
And the movement portion of the player's code:
// Directs The Movement Of The Player
void FixedUpdate()
{
if (!loadingLevel)
{
float vertical = Input.GetAxis("Vertical") * speed;
float horizontal = Input.GetAxis("Horizontal") * speed;
rigidbody.AddForce(0, vertical, 0);
rigidbody.AddForce(horizontal, 0, 0);
} else {
this.rigidbody.velocity = Vector3.zero;
this.rigidbody.angularVelocity = Vector3.zero;
}
}
Any help will be greatly appreciated. Thanks in advance.
Your answer
Follow this Question
Related Questions
RigidBody Script Conflict 1 Answer
Rigidbody Not Sliding Down Slopes 0 Answers
Problem with Rigidbody Parent/Child Relationship with "Teeter Totter" 0 Answers
Strange Rigidbody Behavior 0 Answers
A node in a childnode? 1 Answer