相机变焦 Lerp



我正在努力使用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;
}
}

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

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

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

请注意,单独使用Lerp可能无法保证该位置等于goalPosition。因此,您可能只想设置transform.position = goalPosition;是否"足够接近"。

最新更新