Camera transition : from offset to other offset

Hi,

I have a camera system which allows to change offset from one value to another wether the player is looking towards left or towards right.

I want to make a smooth transition between those two offset values while switching from one side to the other, but I can’t manage to make it.

Can anyone look into this code and help me?

using UnityEngine;
using System.Collections;

public class CameraManager : MonoBehaviour
{

    private Transform followTarget;
    private Vector3 followOffset;
    private Vector3 followOffsetLeft;
    private Vector3 followOffsetRight;
    private Transform lookAtTarget;
    private Vector3 lookAtOffset;
    private Quaternion faceLeft;
    private Quaternion faceRight;
    private Transform playerCharacter;
    private Transform currentPosition;
    private float step;
    private float speedTransition;
    private Vector3 test;

    // Use this for initialization
    void Start()
    {
        followTarget = GameObject.Find("Player Character").GetComponent<Transform>();
        lookAtTarget = GameObject.Find("Camera Look At").GetComponent<Transform>();
        lookAtOffset = Vector3.zero;
        playerCharacter = GameObject.Find("Player Character").GetComponent<Transform>();
        faceRight = new Quaternion(0.0f, 1.0f, 0.0f, 0.0f);
        faceLeft = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
        currentPosition = lookAtTarget;
        step = 0.0f;
        speedTransition = 1.0f;
    }

    // Update is called once per frame
    void Update()
    {
        step += Time.deltaTime * speedTransition;
        followOffsetLeft = new Vector3(-4, 3, -16);
        followOffsetRight = new Vector3(4, 3, -16);
        if (playerCharacter.transform.rotation == faceLeft)
        {
            followOffset = Vector3.Lerp(followOffsetRight, followOffsetLeft, step);
        }
        if (playerCharacter.transform.rotation == faceRight)
        {
            followOffset = Vector3.Lerp(followOffsetLeft, followOffsetRight, step);
        }
        transform.position = followTarget.position + followOffset;
        transform.LookAt(lookAtTarget.position + lookAtOffset);
    }
}

If you want an eased movement, you can do:

if (playerCharacter.transform.rotation == faceLeft)
        {
            followOffset = Vector3.Lerp(followOffset, followOffsetLeft, step);
        }
        if (playerCharacter.transform.rotation == faceRight)
        {
            followOffset = Vector3.Lerp(followOffset, followOffsetRight, step);
        }

Note that ‘followOffsetLeft’ and ‘followOffsetRight’ have been changed to just ‘followOffset’ in the first parameter. In addition to this change you are going to have to initialize ‘followOffset’ in start to either ‘followOffsetLeft’ or ‘followOffsetRight’.

If you want a non-eased movement:

if (playerCharacter.transform.rotation == faceLeft)
        {
            followOffset = Vector3.MoveTowards(followOffset, followOffsetLeft, step);
        }
        if (playerCharacter.transform.rotation == faceRight)
        {
            followOffset = Vector3.MoveTowards(followOffset, followOffsetRight, step);
        }

With the ‘MoveTowards’ change, you will have to adjust the value of ‘speedTransition’.