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);
}