- Home /

# third person camera

Hello I have a third person camera that -when not moving a player can freely look around the character -otherwise it goes behind the character (lookat) and on moving the mouse the character rotates, but I try to achieve that when the player stop moving the camera remains still when it last was here is the code:

if(target && !GuiToggled()) {

```
x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
```

// y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

// y = ClampAngle(y, yMinLimit, yMaxLimit);

```
Quaternion rotation = Quaternion.Euler(0, x, 0);
// calculate the desired distance
desiredDistance -= Input.GetAxis ("Mouse ScrollWheel") * Time.deltaTime * zoomRate * Mathf.Abs (desiredDistance);
desiredDistance = Mathf.Clamp (desiredDistance, minDistance, maxDistance);
correctedDistance = desiredDistance;
vTargetOffset = new Vector3 (0, -targetHeight, 0);
Vector3 position = target.position - (rotation * Vector3.forward * desiredDistance + vTargetOffset);
RaycastHit collisionHit;
Vector3 trueTargetPosition = new Vector3 (target.position.x, target.position.y + targetHeight, target.position.z);
// if there was a collision, correct the camera position and calculate the corrected distance
bool isCorrected = false;
if (Physics.Linecast (trueTargetPosition, position, out collisionHit, collisionLayers.value))
{
// calculate the distance from the original estimated position to the collision location,
// subtracting out a safety "offset" distance from the object we hit. The offset will help
// keep the camera from being right on top of the surface we hit, which usually shows up as
// the surface geometry getting partially clipped by the camera's front clipping plane.
correctedDistance = Vector3.Distance (trueTargetPosition, collisionHit.point) - offsetFromWall;
isCorrected = true;
}
// For smoothing, lerp distance only if either distance wasn't corrected, or correctedDistance is more than currentDistance
currentDistance = !isCorrected || correctedDistance > currentDistance ? Mathf.Lerp (currentDistance, correctedDistance, Time.deltaTime * zoomDampening) : correctedDistance;
// keep within legal limits
currentDistance = Mathf.Clamp (currentDistance, minDistance, maxDistance);
// recalculate position based on the new currentDistance
position = target.position - (rotation * Vector3.forward * currentDistance + vTargetOffset);
_myTransform.rotation = rotation;
_myTransform.position = position;
if(moving)
{
RotateMovement();
}
private void RotateMovement()
{
float rotateSpeed = 5f;
float horizontal = Input.GetAxis("Mouse X") * rotateSpeed;
target.transform.Rotate(0, horizontal, 0);
float desiredAngle = target.transform.eulerAngles.y;
Quaternion rotation = Quaternion.Euler(0, desiredAngle, 0);
transform.position = target.transform.position - (rotation * offset);
transform.LookAt(GameObject.Find("Lookat").transform);
lastRotation = transform.rotation;
}
```

**Answer** by Fornoreason1000
·
Dec 07, 2013 at 04:42 PM

basically you want to stop the camera from *Automatically* moving, which is caused by an automatic angle being set.
that would be these lines here,

```
public Transform target;
public float x;
float xSpeed = 20;
float zoomRate = 2f;
float desiredDistance;
float correctedDistance;
float targetHeight;
float minDistance = 3;
float maxDistance = 12;
float offsetFromWall = .3f;
float currentDistance;
float zoomDampening = 0.1f;
public Vector3 offset;
public float desiredAngle;
public bool moving = true;
Quaternion lastRotation;
Vector3 vTargetOffset = Vector3.up;
public void LateUpdate()
{
if (target)
{
x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
// y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
// y = ClampAngle(y, yMinLimit, yMaxLimit);
Quaternion rotation = Quaternion.Euler(0, x, 0);
// calculate the desired distance
desiredDistance -= Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime * zoomRate * Mathf.Abs(desiredDistance);
desiredDistance = Mathf.Clamp(desiredDistance, minDistance, maxDistance);
correctedDistance = desiredDistance;
vTargetOffset = new Vector3(0, -targetHeight, 0);
Vector3 position = target.position - (rotation * Vector3.forward * desiredDistance + vTargetOffset);
RaycastHit collisionHit;
Vector3 trueTargetPosition = new Vector3(target.position.x, target.position.y + targetHeight, target.position.z);
// if there was a collision, correct the camera position and calculate the corrected distance
bool isCorrected = false;
if (Physics.Linecast(trueTargetPosition, position, out collisionHit))
{
// calculate the distance from the original estimated position to the collision location,
// subtracting out a safety "offset" distance from the object we hit. The offset will help
// keep the camera from being right on top of the surface we hit, which usually shows up as
// the surface geometry getting partially clipped by the camera's front clipping plane.
correctedDistance = Vector3.Distance(trueTargetPosition, collisionHit.point) - offsetFromWall;
isCorrected = true;
}
// For smoothing, lerp distance only if either distance wasn't corrected, or correctedDistance is more than currentDistance
currentDistance = !isCorrected || correctedDistance > currentDistance ? Mathf.Lerp(currentDistance, correctedDistance, Time.deltaTime * zoomDampening) : correctedDistance;
// keep within legal limits
currentDistance = Mathf.Clamp(currentDistance, minDistance, maxDistance);
// recalculate position based on the new currentDistance
position = target.position - (rotation * Vector3.forward * currentDistance + vTargetOffset);
transform.rotation = rotation;
transform.position = position;
RotateMovement();
}
}
private void RotateMovement()
{
float rotateSpeed = 5f;
float horizontal = Input.GetAxis("Mouse X") * rotateSpeed;
if (moving)
{
x = 0;
target.transform.Rotate(0, horizontal, 0);
desiredAngle = target.transform.eulerAngles.y;
}
Quaternion rotation = Quaternion.Euler(0, desiredAngle + x, 0);
transform.position = target.transform.position - (rotation * offset);
transform.LookAt(GameObject.Find("LookAt").transform);
lastRotation = transform.rotation;
}
}
```

then make rotation and moving a member wise variable. also removing the `If(moving)`

in your original code that way the RotateFunction is called to apply the movements sent by the player. nice script btw.

EDIT: the whole time i thought this was an orbit script, it was really a follow.

thanks for the comment Im new to this part of unity (angles, vectors and such) so if i basicly want to set my own rotation i just use the last rotation convert it to an angle and calculate with that the not moving rotation?

yes if you want to do it that way can:

```
if(!moving)
{
rotation = Quaternion.Euler(0, desiredAngle, 0);
//stop this line when player is stationary
}
else {
rotation = Quaternion.Euler(lastRotation.euler + new Vector3 (0, x, 0));
}
```

sorry for the poor formatting, this editor hates me. also you may want to do something about that input x += , you adding 1 * speed each frame, so your camera may go spazzo, if it does let me know.

```
private void RotateMovement()
{
float rotateSpeed = 5f;
float horizontal = Input.GetAxis("Mouse X") * rotateSpeed;
target.transform.Rotate(0, horizontal, 0);
float desiredAngle = target.transform.eulerAngles.y;
if(!moving)
{
rotation = Quaternion.Euler(0, desiredAngle, 0);
//stop this line when player is stationary
}
else
{
rotation = Quaternion.Euler(lastRotation.eulerAngles + new Vector3 (0, x, 0));
}
transform.position = target.transform.position - (rotation * offset);
transform.LookAt(GameObject.Find("Lookat").transform);
lastRotation = transform.rotation;
}
```

my camera is now looking bumping up and down

does it only jitter when you move the camera? does the camera move? does it only jitter when you stop moving the player? try this;

```
float desiredAngle = target.transform.eulerAngles.y;
if(!moving) {
desiredAngle = 0;
}
rotation = Quaternion.Euler(0, desiredAngle + x, 0));
```

### Your answer

### Welcome to Unity Answers

The best place to ask and answer questions about development with Unity.

To help users navigate the site we have posted a site navigation guide.

If you are a new user to Unity Answers, check out our FAQ for more information.

Make sure to check out our Knowledge Base for commonly asked Unity questions.

If you are a moderator, see our Moderator Guidelines page.

We are making improvements to UA, see the list of changes.

### Follow this Question

### Related Questions

Character Camera Movement/ShooterGameCamera On planet with Faux 0 Answers

Make the camera stay behind the third person 1 Answer

Prevent third person camera from clipping through terrain and objects 2 Answers

Drawing architecture normally, but with key items only visible in front of the player 1 Answer

third person camera script? 1 Answer