- Home /
3rd Person Camera with fixed rotation
I've taken the camera script from 3d platformer tutorial and tried to make it work for what I need. As the code is right now the camera rotates with the rotation of the target, but I want it to keep looking in the same direction while keeping the target in the center of the view.
public GameObject Target;
public float Distance = 10.0f;
public float Height = 10.0f;
public float SmoothLag = 0.2f;
public float MaxSpeed = 10.0f;
private Vector3 headOffset = Vector3.zero;
private Vector3 centerOffset = Vector3.zero;
private ThirdPersonController controller;
private Vector3 velocity = Vector3.zero;
private float targetHeight = 100000.0f;
void Awake()
{
CharacterController characterController = (CharacterController)Target.collider;
if(characterController)
{
centerOffset = characterController.bounds.center - Target.transform.position;
headOffset = centerOffset;
headOffset.y = characterController.bounds.max.y - Target.transform.position.y;
}
if(Target)
{
controller = Target.GetComponent<ThirdPersonController>();
}
if(!controller)
{
Debug.Log("Please assign a target to the camera that has a Third Person Controller script component.");
}
}
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
}
void LateUpdate()
{
//transform.position = Target.transform.position + Offset;
Vector3 targetCenter = Target.transform.position;// + centerOffset;
Vector3 targetHead = new Vector3(0,0,1);//Target.transform.position;// + headOffset;
targetHeight = targetCenter.y + Height;
ApplyPositionDamping(new Vector3(targetCenter.x, targetHeight, targetCenter.z));
SetUpRotation(targetCenter, targetHead);
}
void ApplyPositionDamping(Vector3 targetCenter)
{
Vector3 position = transform.position;
Vector3 offset = position - targetCenter;
offset.y = 0;
Vector3 newTargetPos = offset.normalized * Distance + targetCenter;
Vector3 newPosition;
newPosition.x = Mathf.SmoothDamp(position.x, newTargetPos.x, ref velocity.x, SmoothLag, MaxSpeed);
newPosition.z = Mathf.SmoothDamp(position.z, newTargetPos.z, ref velocity.z, SmoothLag, MaxSpeed);
newPosition.y = Mathf.SmoothDamp(position.y, newTargetPos.y, ref velocity.y, SmoothLag, MaxSpeed);
//newPosition = AdjustLineOfSight(newPosition, targetCenter);
transform.position = newPosition;
}
void SetUpRotation(Vector3 centerPos, Vector3 headPos)
{
Vector3 cameraPos = transform.position;
Vector3 offsetToCenter = centerPos - cameraPos;
Quaternion yRotation = Quaternion.LookRotation(new Vector3(offsetToCenter.x, 0, offsetToCenter.z));
//Quaternion yRotation = Quaternion.LookRotation(new Vector3(0, 0, 0));
Vector3 relativeOffset = Vector3.forward * Distance + Vector3.down * Height;
transform.rotation = yRotation * Quaternion.LookRotation(relativeOffset);
}
Answer by syclamoth · Jan 26, 2012 at 03:14 AM
The simplest way to keep the target in the middle of the view of a camera while maintaining the same view direction is to set up something like this-
The camera must be the child of a 'camTarget' object, which you place in the same location as the character's starting position.
Then, put a simple position-copying script on the camTarget, and set the character to its 'target' value:
public Transform target;
void LateUpdate()
{
transform.position = target.position;
}
Set up like this, the camera will always point at the character from the same direction and distance, no matter which way the character is facing!
Your answer
![](https://koobas.hobune.stream/wayback/20220613063415im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
3rd person camera view lock 2 Answers
3rd Person Camera Geometry Navigation 1 Answer
Turning a character to match camera rotation 0 Answers
How do I rotate a character with my mouse? 1 Answer
How to make an object face the mouse in a non-2D world 1 Answer