-
-
Save Hamcha/6096905 to your computer and use it in GitHub Desktop.
// 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); | |
} | |
} |
Thanks very much. Excellent solution. I was working on my own solution. I'm a newbie to C#. Your solution is way better. Thanks for making it available to the public freely. Not many people would. You saved me many hours of work.
Works like a charm for me. Thanks a lot!
Very useful, thanks.
I was modifying the target object's transform in a FixedUpdate method, and as a result there was a juddering effect. To solve this, I declared currentRotationAngle, currentRotation, and currentHeight outside of LateUpdate and then moved lines 44-51 (above) out of LateUpdate and into FixedUpdate. Works great!
My target is a sphere rolling around so its target.eulerAngles.y;
rotates like madness. Doesn't work for me.
why does my camera view swivels?
@SpecOps167 - so edgy!
The code works , but isn't as smooth as I hoped.
I was looking for a GTA style camera that "waits" for you to get a considerable distance before it "snaps into action"
Works like a charm in 2017, thanks!
Thanks, that's perfect.
How do I set the target? I tried
void Start() { target = GameObject.FindGameObjectWithTag("Player").transform; }
But that doesn't work
// Place the script in the Camera-Control group in the component menu
[AddComponentMenu("Camera-Control/Smooth Follow")]
Unsure what this means - can you do this in Unity5? I couldn't see a way of doing it in the Add Component Menu
@azertyalex Drag the transform you'd like to follow onto "Target" in the inspector
when target rotate, the camera is shaking. why?
Best, Thanks :D
Absolute perfection, much appreciated!
Thanks!
It works fine and with all the comments it's easy to tweak according to your requirements.
Nicely done. Thanks -- worked better than mine.
Sweet, thank you! :D I'm updating my old projects from before 2012 and the standard asset scripts not working is making this a lot difficult that it should be, thank you so much! <3
no it doesnt dumbass
5 years later, seems like the dumb ass was you.
Thanks!
no it doesnt dumbass
r/confidentlyincorrect
this works:) thank you so much!
It works perfectly! Thank you for sharing
thanks for your answer.
it's helpful.
I would also recommend others to refer to your answer to solve similar problem.