Unity-实现相机平滑移动到某一位置
1.使用 Mathf.SmoothDamp 或 Vector3.SmoothDamp
这是最基础的平滑移动方式之一,适用于简单的线性插值需求。
using UnityEngine;
public class SmoothCameraMove : MonoBehaviour
{
public Transform target; // 目标位置
public float smoothTime = 0.3f; // 平滑时间
private Vector3 velocity = Vector3.zero; // 速度
void Update()
{
if (target != null)
{
// 计算目标位置(可以是目标的当前位置加上偏移量)
Vector3 targetPosition = target.position;
// 使用 Vector3.SmoothDamp 实现平滑移动
transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);
}
}
}
2.使用 Lerp 或 Slerp
Lerp(线性插值)和 Slerp(球面插值)可以用于更精细的控制,比如固定时间内完成移动或基于百分比进度进行插值。
using UnityEngine;
public class LerpCameraMove : MonoBehaviour
{
public Transform target; // 目标位置
public float duration = 5f; // 移动完成所需的时间
private float startTime; // 开始时间
private Vector3 startPosition; // 初始位置
void Start()
{
startTime = Time.time;
startPosition = transform.position;
}
void Update()
{
if (target != null)
{
// 计算经过的时间比例
float t = (Time.time - startTime) / duration;
t = Mathf.Clamp01(t); // 确保t在[0,1]范围内
// 使用 Lerp 实现平滑移动
transform.position = Vector3.Lerp(startPosition, target.position, t);
}
}
}
3.使用协程
通过协程可以在一段时间内逐步更新相机的位置,给予更大的灵活性。
using UnityEngine;
using System.Collections;
public class CoroutineCameraMove : MonoBehaviour
{
public Transform target; // 目标位置
public float duration = 5f; // 移动完成所需的时间
IEnumerator Start()
{
if (target != null)
{
float elapsedTime = 0f;
Vector3 startPosition = transform.position;
while (elapsedTime < duration)
{
transform.position = Vector3.Lerp(startPosition, target.position, elapsedTime / duration);
elapsedTime += Time.deltaTime;
yield return null;
}
// 确保最终位置准确无误
transform.position = target.position;
}
}
}
4.使用 Cinemachine
Cinemachine 是 Unity 官方提供的一个高级摄像机控制系统,能够提供更加复杂且强大的摄像机行为管理,包括但不限于跟随、震动效果等。
首先确保你的项目中安装了 Cinemachine 包,然后你可以创建一个 CinemachineVirtualCamera 并设置其跟随目标和偏移量等属性。
浙公网安备 33010602011771号