我目前正在尝试使用预定义的相机位置数组平滑地更改相机的位置。 它应该是这样的:
- 我按空格键,相机应该平滑地切换到相机阵列中相机 0的位置。
- 再次按空格键,相机应该平滑地切换到相机阵列中相机1的位置
-
等。
public class CameraWaypoints : MonoBehaviour { public Camera[] CamPOVs; private Camera _main; private int _indexCurrentCamera; private int _indexTargetCamera; private float _speed = 0.1f; void Start () { _indexTargetCamera = 0; _main = Camera.main; //disable all camera's for (int i = 0; i < CamPOVs.Length; i++) { CamPOVs[i].enabled = false; } _indexCurrentCamera = 0; } // Update is called once per frame void Update () { if (Input.GetKeyDown(KeyCode.Space)) { if (_indexTargetCamera < CamPOVs.Length) { _indexCurrentCamera = _indexTargetCamera; _indexTargetCamera++; } } //prevent array out of bounds if (_indexTargetCamera >= CamPOVs.Length) { _indexTargetCamera = 0; } _main.transform.position = Vector3.Lerp(CamPOVs[_indexCurrentCamera].transform.position, CamPOVs[_indexTargetCamera].transform.position, Time.time * _speed); _main.transform.rotation = CamPOVs[_indexTargetCamera].transform.rotation; } }
使用我目前的解决方案,相机实际上可以平稳地移动到目标。 但是,一旦达到该目标,之后按下空格键,相机就会变为目标,而不会平滑。
就好像一旦 lerp 成功完成一次,它就不会再 lerp 了,当然,除非我重新启动。
编辑:澄清一下:按下空格键时,相机目标实际上会发生变化,并且相机会跟随此目标。问题是,一旦相机位置到达目标位置一次,它就不会再平稳地接近目标,而是立即将其位置更改为目标。
按下空格键,相机就会变为目标, 没有平滑。
按space
时,源和目标都会更改,因此您可以立即设置转换的位置。
一旦 lerp 成功完成一次,它就不会 lerp 再次,除非我重新启动当然。
从文档中:
1. 时间.时间
这是自游戏开始以来的秒时间
阿拉伯数字。矢量3.勒普
参数 t(时间)被钳位在 [0, 1] 范围内
因此,Time.time
将继续上升,但Lerp
将钳制到最大值 1。当您计算Time.time * 0.1 (your speed)
时,需要 10 秒才能达到目标。任何超过 10 秒的内容都将被限制为 1,这将导致立即跳转到您的目的地。请改用Time.deltaTime
。
此外,您不需要多个摄像机来充当定位目标。一系列转换就好了。
综上所述,它应该如下所示:
public class CameraWaypoints : MonoBehaviour
{
public Transform[] CamPOVs;
public float _speed = 0.1f;
private Camera _main;
private int _indexTargetCamera;
void Awake ()
{
_main = Camera.main;
_indexTargetCamera = 0;
}
void Update ()
{
if (Input.GetKeyDown(KeyCode.Space))
{
_indexTargetCamera = ++_indexTargetCamera % CamPOVs.Length;
}
var time = Time.deltaTime * _speed;
// Alternatives to Lerp are MoveTowards and Slerp (for rotation)
var position = Vector3.Lerp(_main.transform.position, CamPOVs[_indexTargetCamera].position, time);
var rotation = Quaternion.Lerp(_main.transform.rotation, CamPOVs[_indexTargetCamera].rotation, time);
_main.transform.position = position;
_main.transform.rotation = rotation;
}
}