我目前正尝试使用预先定义的相机位置阵列平滑地更改相机的位置。 它应该是这样的:
等
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成功完成一次,它就不会再次出现,除非我重新开始使用。
编辑:澄清:当按下空格时,摄像机目标实际上会改变,摄像机会跟随此目标。问题是,一旦摄像机位置到达目标位置一次,它就不会再平稳地向目标移动,而是立即将其位置改变为目标。
答案 0 :(得分:1)
在按下空格后,相机才会改变目标, 没有平滑。
当您按space
时,源和目标都会发生变化,因此您需要立即设置变换位置。
一旦lerp成功完成一次,它就不会有任何变化 再次,除非我重新开始。
来自doc:
<强> 1。 Time.time
这是自游戏开始以来的秒数
<强> 2。 Vector3.Lerp
参数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;
}
}