C# 相机变焦

C# 相机变焦,c#,unity3d,C#,Unity3d,我正在努力使用Lerp来平滑我的相机变焦。下面的代码是我编写的用于放大和缩小相机的代码片段。我知道我应该在 transform.position = cameraTarget.position - (transform.rotation * Vector3.forward * distance); 在LateUpdate功能中,但我一辈子都无法找出我的错误所在 public class CameraController : MonoBehaviour { [SerializeField

我正在努力使用Lerp来平滑我的相机变焦。下面的代码是我编写的用于放大和缩小相机的代码片段。我知道我应该在

transform.position = cameraTarget.position - (transform.rotation * Vector3.forward * distance);
在LateUpdate功能中,但我一辈子都无法找出我的错误所在

public class CameraController : MonoBehaviour
{
    [SerializeField] private Transform cameraTarget;
    [SerializeField] private Transform cameraMain;

    [Header("Distance from camera to target")]
    public float minDistance = 6;
    public float maxDistance = 20;
    public float distance = 20;

    [Header("Zoom and scroll variables")]
    public KeyCode scrollButton = KeyCode.Mouse2;
    [Range(0.5f, 1.5f)] public float zoomSpeed = 1;
    [Range(0.5f, 1.5f)] public float rotationSpeed = 1;
    public float xMinAngle = 25;
    public float xMaxAngle = 80;

    void LateUpdate()
    {
        if (!cameraTarget) return;

        CameraZoom();

        transform.position = cameraTarget.position - (transform.rotation * Vector3.forward * distance);
    }

    private void CameraZoom()
    {
        //Add a lerp function to smooth the zoom
        float step = GetAxisRawScrollUniversal() * zoomSpeed;
        distance = Mathf.Clamp(distance - step, minDistance, maxDistance);
    }

    public static float GetAxisRawScrollUniversal()
    {
        float scroll = Input.GetAxisRaw("Mouse ScrollWheel");
        if (scroll < 0) return -1;
        if (scroll > 0) return 1;
        return 0;
    }
}
公共类CameraController:MonoBehavior
{
[SerializeField]专用转换摄像机目标;
[SerializeField]专用转换摄像机;
[标题(“从摄像机到目标的距离”)]
公众漂浮距离=6;
公共浮点数maxDistance=20;
公共浮动距离=20;
[标题(“缩放和滚动变量”)]
public KeyCode scrollButton=KeyCode.Mouse2;
[范围(0.5f,1.5f)]公共浮动缩放速度=1;
[范围(0.5f,1.5f)]公共浮子旋转速度=1;
公共浮动Xminagle=25;
公共浮点数xMaxAngle=80;
void LateUpdate()
{
如果(!cameraTarget)返回;
CameraZoom();
transform.position=摄像机目标位置-(transform.rotation*矢量3.forward*距离);
}
私人空位CameraZoom()
{
//添加lerp函数以平滑缩放
float step=GetAxisRawScrollUniversal()*缩放速度;
距离=数学夹具(距离-步长、minDistance、maxDistance);
}
公共静态浮点GetAxisRawScrollUniversal()
{
float scroll=Input.GetAxisRaw(“鼠标滚轮”);
如果(滚动<0)返回-1;
如果(滚动>0)返回1;
返回0;
}
}

定义一个
zoomLerpFactor
字段,然后使用
Vector3.Lerp
从当前位置转到您将设置为
transform.position
的位置

[Range(0f, 1f)] public float zoomLerpFactor = 0.3f; 

请注意,单独使用
Lerp
可能无法保证位置等于
目标位置。因此,您可能只需要设置
transform.position=goalPosition如果“足够近”

Vector3 goalPosition =   cameraTarget.position 
                       - (transform.rotation * Vector3.forward * distance);

transform.position = Vector3.Lerp(transform.position, goalPosition, zoomLerpFactor);