基本上我在场景中有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);
}
答案 0 :(得分:1)
我认为你误解了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.position
,您将产生一种有趣的缓和效果 - 因为您的输出将总是接近40%。
编写代码的方式,您可能更愿意使用MoveTowards
和RotateTowards
,而不是:
endPosition
这些帮助函数的工作方式不同,允许您将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
度旋转到更接近某个方向。