
using UnityEngine;
public class DollyZoom : MonoBehaviour
{
private Camera _cam;
[SerializeField] private Transform target;
[SerializeField] private float zoomSpeed;
private float _initHeightAtDist;
private float FrustumHeightAtDistance(float distance)
{
return 2.0f * distance * Mathf.Tan(_cam.fieldOfView * 0.5f * Mathf.Deg2Rad);
}
private static float FOVForHeightAndDistance(float height, float distance)
{
return 2.0f * Mathf.Atan(height * 0.5f / distance) * Mathf.Rad2Deg;
}
public void Start()
{
_cam = Camera.main;
var distance = Vector3.Distance(transform.position, target.position);
_initHeightAtDist = FrustumHeightAtDistance(distance);
}
private void Update()
{
var currDistance = Vector3.Distance(transform.position, target.position);
_cam.fieldOfView = FOVForHeightAndDistance(_initHeightAtDist, currDistance);
var movementInput = Input.GetAxis("Vertical") * Time.deltaTime * zoomSpeed;
transform.Translate(Vector3.forward * movementInput);
}
}
本质上是移动相机,根据对拍摄目标的相对移动距离计算fov。