How to move camera on an angle

I’m trying to rotate the camera around a box, like when the box moves on the X angle, the camera will have a position on the X angle, following the box, but If the player press “D” the box starts to move on the Z angle and the camera needs to rotate around that box to have a position at the back of the box.

My script(as you can see,I tried to rotate the camera manually, but I failed):

using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour {

    public GameObject cube;
    public float rotateSpeed = 5;
    Vector3 offset;

	// Use this for initialization
	void Start () {
        offset = cube.transform.position - transform.position;
	}
	
	// Update is called once per frame
	void Update () {
        
        //if (CharachterControll.movingDirect == 1) {
            //transform.position = new Vector3(cube.transform.position.x - 12, cube.transform.position.y + 8, transform.position.z);
        //}
        //else if (CharachterControll.movingDirect == 2)
       // {
            //transform.position = new Vector3(cube.transform.position.x, cube.transform.position.y + 8, transform.position.z - 12);
        //}
	}

    void LateUpdate()
    {
        if (CharachterControll.movingDirect == 1)
        {
            //float horizontal = Input.GetAxis("Mouse X") * rotateSpeed;
            //cube.transform.Rotate(0, horizontal, 0);

            float desiredAngle = cube.transform.eulerAngles.y;
            Quaternion rotation = Quaternion.Euler(0, desiredAngle, 0);
            transform.position = cube.transform.position - (rotation * offset);
        }
        else if (CharachterControll.movingDirect == 2)
        {
            float desiredAngle = cube.transform.eulerAngles.y;
            Quaternion rotation = Quaternion.Euler(0, desiredAngle, 0);
            transform.position = cube.transform.position - (rotation * offset);
        }
        transform.LookAt(cube.transform);
    }
}

(Sorry for my english)

I’m out of time for a detailed answer. It can be done with a single game object, but a simple solution can be done with two objects:

  • Create an empty game object and place it at the center of the box. The empty game object’s initial rotation must match the box.
  • Make the camera a child of the empty game object at the right distance and looking at the box.
  • Add a line of code in LateUpdate() that has the empty game object tracking the box (it is not a child, simply following the position of the box).
  • Have the empty game object rotate to look at the direction of movement.
  • Slerp or Lerp the rotation as necessary.