You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现按空格键基于相机数组依次平滑切换相机位置?

实现空格键触发的相机位置平滑循环切换

你想要的是通过空格键依次触发主相机平滑切换到预定义相机数组的位置,循环往复的功能对吧?我帮你把代码补全并梳理清楚逻辑:

首先,先把你给出的代码片段补全,完整实现如下:

using UnityEngine;

public class CameraWaypoints : MonoBehaviour
{
    public Camera[] CamPOVs; // 存储预设的相机位置/视角
    private Camera _mainCamera;
    private int _currentIndex = 0;
    private int _targetIndex = 0;
    public float smoothSpeed = 2.5f; // 平滑移动的速度,数值越大越快
    private bool isMoving = false; // 标记是否正在平滑移动,防止重复触发

    void Start()
    {
        // 获取主相机
        _mainCamera = Camera.main;
        // 初始化主相机到第一个预设相机的位置
        if (CamPOVs.Length > 0)
        {
            _mainCamera.transform.position = CamPOVs[_currentIndex].transform.position;
            _mainCamera.transform.rotation = CamPOVs[_currentIndex].transform.rotation;
        }
    }

    void Update()
    {
        // 检测空格键按下,且当前没有在移动中
        if (Input.GetKeyDown(KeyCode.Space) && !isMoving)
        {
            // 更新目标索引,循环切换
            _targetIndex = (_currentIndex + 1) % CamPOVs.Length;
            isMoving = true;
        }

        // 如果正在移动,执行平滑过渡
        if (isMoving)
        {
            // 平滑移动位置
            _mainCamera.transform.position = Vector3.Lerp(
                _mainCamera.transform.position,
                CamPOVs[_targetIndex].transform.position,
                smoothSpeed * Time.deltaTime
            );
            // 平滑旋转视角
            _mainCamera.transform.rotation = Quaternion.Lerp(
                _mainCamera.transform.rotation,
                CamPOVs[_targetIndex].transform.rotation,
                smoothSpeed * Time.deltaTime
            );

            // 判断是否已经到达目标位置/视角(可以调整阈值,避免无限接近)
            float positionDistance = Vector3.Distance(_mainCamera.transform.position, CamPOVs[_targetIndex].transform.position);
            float rotationAngle = Quaternion.Angle(_mainCamera.transform.rotation, CamPOVs[_targetIndex].transform.rotation);
            if (positionDistance < 0.01f && rotationAngle < 0.1f)
            {
                // 强制设置到目标位置,避免误差
                _mainCamera.transform.position = CamPOVs[_targetIndex].transform.position;
                _mainCamera.transform.rotation = CamPOVs[_targetIndex].transform.rotation;
                // 更新当前索引,标记移动结束
                _currentIndex = _targetIndex;
                isMoving = false;
            }
        }
    }
}

关键逻辑说明:

  • 初始化:在Start()里获取主相机,并将其初始位置设置为数组第一个相机的位置和旋转。
  • 触发切换:通过Input.GetKeyDown(KeyCode.Space)检测空格键按下,同时用isMoving变量防止在平滑过程中重复触发,避免混乱。
  • 循环索引:用(_currentIndex + 1) % CamPOVs.Length实现数组索引的循环,当切换到最后一个相机后,再次按下空格会回到第一个。
  • 平滑过渡:使用Vector3.Lerp处理位置的平滑移动,Quaternion.Lerp处理旋转的平滑过渡,配合Time.deltaTime保证帧率无关的平滑效果。
  • 到达判断:通过计算位置距离和旋转角度的阈值,判断是否已经完成切换,然后更新状态和索引。

使用注意事项:

  • 确保在Unity编辑器中,将预设的相机对象拖入CamPOVs数组中。
  • 可以调整smoothSpeed参数来控制切换的快慢,数值越大切换速度越快。
  • 如果不需要旋转平滑,只保留位置的Lerp逻辑即可。

内容的提问来源于stack exchange,提问作者Thrindil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:33:33