Allow Camera to Smart smooth follow the player attached to main camera
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
using System.Collections; | |
public class PlayerSmoothFollow : MonoBehaviour { | |
[SerializeField] private Transform target = null; | |
[SerializeField] private float distance = 20f; | |
[SerializeField] private float height = 5f; | |
[SerializeField] private float damping = 5f; | |
[SerializeField] private bool smoothRotation = true; | |
[SerializeField] private float rotationDamping = 10.0f; | |
[SerializeField] private Vector3 targetLookAtOffset; // allows offsetting of camera lookAt, very useful for low bumper heights | |
[SerializeField] private float bumperDistanceCheck = 2.5f; // length of bumper ray | |
[SerializeField] private float bumperCameraHeight = 1.0f; // adjust camera height while bumping | |
[SerializeField] private Vector3 bumperRayOffset; // allows offset of the bumper ray from target origin | |
/// <Summary> | |
/// If the target moves, the camera should child the target to allow for smoother movement. DR | |
/// </Summary> | |
private void Awake() | |
{ | |
GetComponent<Camera>().transform.parent = target; | |
} | |
private void FixedUpdate() | |
{ | |
Vector3 wantedPosition = target.TransformPoint(0, height, -distance); | |
// check to see if there is anything behind the target | |
RaycastHit hit; | |
Vector3 back = target.transform.TransformDirection(-1 * Vector3.forward); | |
// cast the bumper ray out from rear and check to see if there is anything behind | |
if (Physics.Raycast(target.TransformPoint(bumperRayOffset), back, out hit, bumperDistanceCheck) | |
&& hit.transform != target) // ignore ray-casts that hit the user. DR | |
{ | |
// clamp wanted position to hit position | |
wantedPosition.x = hit.point.x; | |
wantedPosition.z = hit.point.z; | |
wantedPosition.y = Mathf.Lerp(hit.point.y + bumperCameraHeight, wantedPosition.y, Time.deltaTime * damping); | |
} | |
transform.position = Vector3.Lerp(transform.position, wantedPosition, Time.deltaTime * damping); | |
Vector3 lookPosition = target.TransformPoint(targetLookAtOffset); | |
if (smoothRotation) | |
{ | |
Quaternion wantedRotation = Quaternion.LookRotation(lookPosition - transform.position, target.up); | |
transform.rotation = Quaternion.Slerp(transform.rotation, wantedRotation, Time.deltaTime * rotationDamping); | |
} | |
else | |
transform.rotation = Quaternion.LookRotation(lookPosition - transform.position, target.up); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment