(1)简单版跟随:只跟随目标物体坐标,不跟随目标物体旋转
using UnityEngine; using System.Collections; public class CameraFollow : MonoBehaviour { [SerializeField] private Transform target; /// <summary> /// 水平距离 /// </summary> [SerializeField] private float m_Distance = 5f; /// <summary> /// 竖直高度 /// </summary> [SerializeField] private float m_Height = 2f; [SerializeField] private float m_DistanceDamping = 15f; [SerializeField] private float m_HeightDamping = 20f; void Start () { } // Update is called once per frame void LateUpdate () { if (target == null) return; FollowLogic(); } void FollowLogic() { Vector3 targetP = target.position; Vector3 currentP = transform.position; float tweenHorizontal = Mathf.Lerp(currentP.z, targetP.z - m_Distance, m_DistanceDamping * Time.deltaTime); float tweenVertical = Mathf.Lerp(currentP.y, targetP.y + m_Height, m_HeightDamping * Time.deltaTime); transform.position = new Vector3(targetP.x, tweenVertical, tweenHorizontal); transform.LookAt(target); } }使用方式:将该脚本添加到摄像机,拖动目标对象到target即可。
(2)SmoothFollow:不仅仅跟随目标物体坐标,同时跟随目标物体的旋转,代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SmoothFollow : MonoBehaviour { // The target we are following [SerializeField] private Transform target; // The distance in the x-z plane to the target [SerializeField] private float distance = 10.0f; // the height we want the camera to be above the target [SerializeField] private float height = 5.0f; [SerializeField] private float rotationDamping=10f; [SerializeField] private float heightDamping=15f; // Use this for initialization void Start() { } // Update is called once per frame void LateUpdate() { // Early out if we don't have a target if (!target) return; // Calculate the current rotation angles var wantedRotationAngle = target.eulerAngles.y; var wantedHeight = target.position.y + height; var currentRotationAngle = transform.eulerAngles.y; var 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); } }使用方式如下:将该脚本添加给摄像机,拖动目标跟随物体到target,调整参数即可实现