相机移动到错误的方向,当我使其活跃.Unity5

本文关键字:活跃 Unity5 移动 错误 方向 相机 | 更新日期: 2023-09-27 17:50:35

基本上我在场景中有2个相机,我通过按一个按钮使第二个相机活动。当它激活时,我希望它从原始位置移动到我在脚本中指定的位置。但实际情况是,当第二个摄像头激活时,它会移动到很远的地方。

我把我的第二个相机放在我想要的地方,并记录x/y/z位置和旋转,然后我把它放在脚本作为startPosition。之后,我移动相机一点,并把它的Start()移动到它的startPosoton。所以当我激活第二个摄像头时它应该从它的位置移动到这个startPosition,但它不是。

有人有这个问题吗?

这是我的部分代码:所以当第二个摄像头激活时,它会这样做

public float smoothTime = 2;
private Vector3 newPosition;
private Quaternion newRotation;
private Vector3 startPosition = new Vector3 (-139.56f,6.58f,21.82f);
private Quaternion startRotation = Quaternion.Euler(0.22f,212.71f, 0f);
void Awake(){
    newPosition = transform.position;
    newRotation = transform.rotation;
}
void Start () {
    newPosition = startPosition;
    newRotation = startRotation;
}
void Update () {
    PositionAndRotationChanging ();
}
void PositionAndRotationChanging () {
    transform.position = Vector3.Lerp 
    (transform.position,newPosition,Time.deltaTime * smoothTime);
    transform.rotation = Quaternion.Slerp(transform.rotation, newRotation,    
    Time.deltaTime * smoothTime);
}

相机移动到错误的方向,当我使其活跃.Unity5

我想你误解了lerp的作用。"线性插值"接受两个值并返回另一个值,即它们之间的t %。如果您从不传递0或1的t,则您将永远不会在输出中看到这两个端点。

通常情况下,您可能会传入一个t,随着时间的推移而增加。例如,你可以有一个浮点数timer,每帧增加一次Time.deltaTime:

float timer;
Vector3 startPosition = Vector3.zero;
Vector3 endPosition = Vector3.up * 10f;
//move from "startPosition" to "endPosition" over 20 seconds
void Update() {
    timer += Time.deltaTime;
    transform.position = Vector3.Lerp(startPosition, endPosition, timer / 20f);
}

在你的情况下,你保持t或多或少不变。它大概等于smoothTime乘以0.02。通过反复移动transform.positionendPosition,您将产生一种有趣的舒缓效果——因为您的输出总是会接近40%。

根据您编写代码的方式,您可能更喜欢使用MoveTowardsRotateTowards,而不是:

public class ExampleClass : MonoBehaviour {
    public Transform target;
    public float moveSpeed;
    public float rotSpeed;
    void Update() {
        float move = moveSpeed * Time.deltaTime;
        transform.position = Vector3.MoveTowards(transform.position, target.position, move);
        float rot = rotSpeed * Time.deltaTime;
        transform.rotation = Quaternion.RotateTowards(transform.rotation, target.rotation, rot);
    }
}

这些辅助函数的工作方式不同,允许您将X单元移动到更靠近某个点的位置,或将Y旋转到更靠近某个方向的位置。