如何在Unity3D中通过按下按钮使相机随时间可见地旋转?

fumotvh3  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(105)

现在,我有两个按钮,旋转正交电影摄影机围绕我的播放器,一个顺时针90度,一个逆时针90度。按钮的On Click()分别从相机上的脚本调用这两个函数:

public void CameraRotateL()
  {
      if (PauseMenu.isPaused == false)
          transform.RotateAround(player.transform.position, Vector3.up, 90);
  }

  public void CameraRotateR()
  {
      if (PauseMenu.isPaused == false)
          transform.RotateAround(player.transform.position, Vector3.up, -90);
  }

这工作完美,但我想为相机明显旋转通过90度在很短的时间内,当按钮被点击。我试过:

transform.RotateAround(player.transform.position, Vector3.up, (90/timeToRotate) * Time.deltaTime);

但结果是按钮在一个单一的帧中移动相机很小的量。
我假设我可能需要使用某种类型的协程或比我现在尝试的更复杂的东西,但希望这可以在不使用补间库的情况下完成。提前感谢您的任何指导!
我试着从度数和timeToRotate计算速度,并将其乘以Time.deltaTime,但使用按钮调用此函数只能在一帧内旋转相机少量,而不是在一秒钟内平滑旋转90度。

xriantvc

xriantvc1#

可以使用协程或使用Update()函数来逐渐更改旋转。
这个方法是正确的,但是你需要多次调用它才能工作,因为它会随着时间的推移不断地改变旋转:

transform.RotateAround(player.transform.position, Vector3.up, (90/timeToRotate) * Time.deltaTime);

一种方法是在点击对象时设置一个目标旋转,然后逐渐旋转,直到它足够接近目标旋转

Vector3 startingRotation;
Vector3 targetRotation;
int timeCounter;
bool rotateToTarget = false;

public void CameraRotateL()
{
    if(PauseMenu.isPaused == false)
    {
        startingRotation = player.transform.rotation.Euler;
        targetRotation = player.transform.rotation.Euler + (Vector3.up * 90);     
        timeCounter = 0;
        rotateToTarget = true;
    }
}

public void CameraRotateR()
{
    if(PauseMenu.isPaused == false)
    {
        startingRotation = player.transform.rotation.Euler;
        targetRotation = player.transform.rotation.Euler + (Vector3.up * -90);     
        timeCounter = 0;
        rotateToTarget = true;
    }
}

void Update()
{
    if(rotateToTarget)
    {
        transform.rotation = Quaternion.Slerp(Quaternion.Euler(startingRotation), Quaternion.Euler(targetRotation), timeCounter );
        timeCount = timeCount + Time.deltaTime * rotationSpeed;
        if(transform.rotation == targetRotation) rotateToTarget = false;
    }
}

您可以简化代码,不在Vector3中存储startRotation和targetRotation,而是在四元数中存储。但我相信这种方式更容易理解

相关问题