From Unify Community Wiki
Jump to: navigation, search

Author: --Digitalos 18:57, 9 July 2009 (PDT)[Digitalos]


A pretty basic C# camera that allows you to turn on/of zoom or rotation as you desire. I plan to add to this to include mousetracking and a few other options, feel free to contribute too. This was a rewrite of the included orbit cam as to allow some toggles and generally make it more readable.


using UnityEngine;
public class FollowTrackingCamera : MonoBehaviour
    // Camera target to look at.
    public Transform target;
    // Exposed vars for the camera position from the target.
    public float height = 20f;
    public float distance = 20f;
    // Camera limits.
    public float min = 10f;
    public float max = 60;
    // Rotation.
    public float rotateSpeed = 1f;
    // Options.
    public bool doRotate;
    public bool doZoom;
    // The movement amount when zooming.
    public float zoomStep = 30f;
    public float zoomSpeed = 5f;
    private float heightWanted;
    private float distanceWanted;
    // Result vectors.
    private Vector3 zoomResult;
    private Quaternion rotationResult;
    private Vector3 targetAdjustedPosition;
    void Start(){
        // Initialise default zoom vals.
        heightWanted = height;
        distanceWanted = distance;
        // Setup our default camera.  We set the zoom result to be our default position.
        zoomResult = new Vector3(0f, height, -distance);
    void LateUpdate(){
        // Check target.
        if( !target ){
            Debug.LogError("This camera has no target, you need to assign a target in the inspector.");
        if( doZoom ){
            // Record our mouse input.  If we zoom add this to our height and distance.
            float mouseInput = Input.GetAxis("Mouse ScrollWheel");
            heightWanted -= zoomStep * mouseInput;
            distanceWanted -= zoomStep * mouseInput;
            // Make sure they meet our min/max values.
            heightWanted = Mathf.Clamp(heightWanted, min, max);
            distanceWanted = Mathf.Clamp(distanceWanted, min, max);
            height = Mathf.Lerp(height, heightWanted, Time.deltaTime * zoomSpeed);
            distance = Mathf.Lerp(distance, distanceWanted, Time.deltaTime * zoomSpeed);
            // Post our result.
            zoomResult = new Vector3(0f, height, -distance);
        if( doRotate ){
            // Work out the current and wanted rots.
            float currentRotationAngle = transform.eulerAngles.y;
            float wantedRotationAngle = target.eulerAngles.y;
            // Smooth the rotation.
            currentRotationAngle = Mathf.LerpAngle(currentRotationAngle, wantedRotationAngle, rotateSpeed * Time.deltaTime);
            // Convert the angle into a rotation.
            rotationResult = Quaternion.Euler(0f, currentRotationAngle, 0f);
        // Set the camera position reference.
        targetAdjustedPosition = rotationResult * zoomResult;
        transform.position = target.position + targetAdjustedPosition;
        // Face the desired position.
Personal tools