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 并设置其跟随目标和偏移量等属性。

posted @ 2025-08-08 17:11  motley  阅读(154)  评论(0)    收藏  举报