Skip to content

Instantly share code, notes, and snippets.

@hzi-dev
Forked from Hamcha/SmoothFollow.cs
Created June 4, 2020 23:37
Show Gist options
  • Save hzi-dev/1008ffcd56637e2c504bf03f2d49e5dd to your computer and use it in GitHub Desktop.
Save hzi-dev/1008ffcd56637e2c504bf03f2d49e5dd to your computer and use it in GitHub Desktop.

Revisions

  1. @Hamcha Hamcha created this gist Jul 28, 2013.
    53 changes: 53 additions & 0 deletions SmoothFollow.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,53 @@
    // Smooth Follow from Standard Assets
    // Converted to C# because I fucking hate UnityScript and it's inexistant C# interoperability
    // If you have C# code and you want to edit SmoothFollow's vars ingame, use this instead.
    using UnityEngine;
    using System.Collections;

    public class SmoothFollow : MonoBehaviour {

    // The target we are following
    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);
    }
    }