要在Unity中添加动画和插值计算,可以使用Unity的动画系统和插值函数。下面是一个示例代码,演示了如何在相机切换POI点位时添加动画和插值计算:
using UnityEngine;
public class SmartParkCameraController : MonoBehaviour
{
public Transform[] poiPoints; // POI点位数组
public float transitionSpeed = 5f; // 相机移动的速度
private Transform cameraTransform;
private Transform currentPoint;
private int currentPointIndex = 0;
private bool transition = false;
private float transitionTime = 0f;
private void Start()
{
cameraTransform = Camera.main.transform;
if (poiPoints.Length > 0)
{
currentPoint = poiPoints[currentPointIndex];
}
}
private void Update()
{
// 点击鼠标左键切换到下一个POI点位
if (Input.GetMouseButtonDown(0))
{
currentPointIndex = (currentPointIndex + 1) % poiPoints.Length;
currentPoint = poiPoints[currentPointIndex];
transition = true;
transitionTime = 0f;
}
// 相机平滑移动到目标点位
if (transition)
{
Vector3 startCameraPosition = cameraTransform.position;
Quaternion startCameraRotation = cameraTransform.rotation;
Vector3 targetPosition = currentPoint.position;
Quaternion targetRotation = currentPoint.rotation;
transitionTime += Time.deltaTime;
// 使用插值函数计算平滑过渡的位置和旋转
float t = Mathf.Clamp01(transitionTime / transitionSpeed);
cameraTransform.position = Vector3.Lerp(startCameraPosition, targetPosition, t);
cameraTransform.rotation = Quaternion.Slerp(startCameraRotation, targetRotation, t);
// 当相机接近目标点位时,停止过渡效果
if (Vector3.Distance(cameraTransform.position, targetPosition) < 0.1f)
{
transition = false;
}
}
}
}
在这个示例代码中,我们添加了一个transitionTime变量来记录过渡的时间。当点击右键切换目标点位时,我们将transitionTime重置为0,并使用插值函数来计算位置和旋转的插值比例t。
通过使用Mathf.Clamp01函数将t值限制在0到1之间,我们得到一个平滑的过渡效果,其中0表示最初的位置和旋转,1表示目标位置和旋转。
在每个帧上,我们按照插值比例t计算并应用相机的过渡位置和旋转。当过渡时间超过过渡速度时,我们停止过渡效果,并将transition设置为false。
通过这种方式,你可以在切换POI点位时,通过动画和插值计算实现平滑移动相机到目标位置和旋转的效果。
你可以根据需要调整过渡速度、插值函数和其他动画参数,以实现符合你项目需求的动画效果。