(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,调整参数即可实现