航点上的Unity3D位置和旋转匹配

时间:2017-07-04 11:00:16

标签: c# unity3d

我有一个简单的航点系统。它使用数组变换作为保存航点值的存储区。

我使用这个航点系统通过向一个点移动到另一个点来移动整个场景中的摄像机。场景并不大 - 所以一切都很接近。

按钮单击/按下,相机从一个位置移动到另一个位置。这很好。enter image description here

void Start()
{
    //Sets the Camera to the first point
    Camera = GameObject.Find("Main Camera");
    Camera.transform.position = patrolPoints[0].position
    currentPoint = 0;
}

//Fixed Update seems to work better for LookAt
void FixedUpdate()
{
    //Looks at initial Target
    Camera.transform.LookAt(TargetPoints[0]);

    if (click == true)
    {
        Camera.transform.position = Vector3.MoveTowards(Camera.transform.position, patrolPoints[currentPoint].position, moveSpeed * Time.deltaTime);
        //Camera.transform.rotation = Quaternion.Slerp(Camera.transform.rotation, patrolPoints[currentPoint].transform.rotation,  Time.deltaTime);
        Camera.transform.LookAt(TargetPoints[currentPoint]);
    }



}

public void onNextClick()
{
    if (currentPoint >= patrolPoints.Length)
    {
        currentPoint = 0;
    }
    if (Camera.transform.position == patrolPoints[currentPoint].position)
    {
        currentPoint++;
        click = true;
    }

}

我对变换的一个方面有困难,我还没有谈过。这就是轮换。

我已经使用lookAt来设置第一个看点的目标,这是有效的。然而,当它在阵列中运行到下一个目标时 - 变化是突然的。

我在镜头中也尝试了一个Slerp - 当航点被放置在适当的旋转值时 - 这个值可以工作 - 并且值Slerps从一个位置到下一个位置。然而,时机尚未完全调整。一些位置转换更快到达 - 意味着轮换试图赶上/而其他人则落后。

我已尝试获取当前航点与下一航点之间的距离,并将其视为相对于摄像机当前位置的更新中的整体百分比 - 我相信这可以帮助确定旋转应该定向的距离鉴于职位更新。

然而,我有点迷失方向。很多例子都建议看看iTween - 我不认为这会有用 - 但是,我想稍微考虑一下数据。

有人能让我朝着正确的方向前进吗?

1 个答案:

答案 0 :(得分:1)

看起来Lerp for Position和Slerp for Rotation完成了这个伎俩。 MoveTowards没有在旋转时使用Slerp打球 - 所以我认为时间不对齐。

   if (click == true)
    {
        Camera.transform.position = Vector3.MoveTowards(Camera.transform.position, patrolPoints[currentPoint].position, moveSpeed * Time.deltaTime);
        Camera.transform.rotation = Quaternion.Lerp(Camera.transform.rotation, patrolPoints[currentPoint].rotation, moveSpeed * Time.deltaTime);

我一直认为lerp值的作用就像这样的百分比 - 所以相同的输入值对它起作用。

最后,我使用了当前位置与点击更新之间距离的范围 - 这有助于加快点击按钮的速度。

 if (Vector3.Distance(Camera.transform.position, patrolPoints[currentPoint].position) < PositionThreshold)
    {
        currentPoint++;
        click = true;
    }

感谢您的时间。