C# Unity scripts

Create an C# file with the follow script and drag to the camara inspector. then set the target.

using UnityEngine;
using System.Collections;

public class SmoothFollow : MonoBehaviour {
    
	// The target
	public Transform target;
	// The distance in the x-z plane to the target
	public float distance = 10.0f;
	// the height we want the camera to be above the target
	public float height = 5.0f;
	// How much we 
	public float heightDamping = 2.0f;
	public float rotationDamping = 3.0f;

	// Place the script in the Camera-Control group in the component menu
	[AddComponentMenu("Camera-Control/Smooth Follow")]

	void LateUpdate () {
		// Early out if we don't have a target
		if (!target) return;

		// Calculate the current rotation angles
		float wantedRotationAngle = target.eulerAngles.y;
		float wantedHeight = target.position.y + height;

		float currentRotationAngle = transform.eulerAngles.y;
		float currentHeight = transform.position.y;

		// Damp the rotation around the y-axis
		currentRotationAngle = Mathf.LerpAngle(currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime);
	
		// Damp the height
		currentHeight = Mathf.Lerp(currentHeight, wantedHeight, heightDamping * Time.deltaTime);

		// Convert the angle into a rotation
		var currentRotation = Quaternion.Euler(0, currentRotationAngle, 0);
	
		// Set the position of the camera on the x-z plane to:
		// distance meters behind the target
		transform.position = target.position;
		transform.position -= currentRotation * Vector3.forward * distance;

		// Set the height of the camera
		transform.position = new Vector3(transform.position.x,currentHeight,transform.position.z);
	
		// Always look at the target
		transform.LookAt(target);
	}
}

Experimental controller

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Cube : MonoBehaviour {
    
    public float moveSpeed;
    public float rotateSpeed;
    public float Speed;

    void Update()
    {
        transform.Translate(
            moveSpeed*Input.GetAxis("Horizontal")*Time.deltaTime,
            moveSpeed*Input.GetAxis("Vertical")*Time.deltaTime,
            Speed*Input.GetAxis("Jump")*Time.deltaTime
            
        );
        transform.Rotate(
            rotateSpeed*Input.GetAxis("Vertical")*Time.deltaTime,
            rotateSpeed*Input.GetAxis("Horizontal")*Time.deltaTime,
            0f
        );
    }
}

The transforms has three axis, two of which are connected