当玩家按住 space 条时,如何将相机旋转 180 度以回头看?

How do i rotate the camera 180 Degrees to look back when a player holds down the space bar?

我正在统一创建一个游戏,玩家可以使用箭头键在地图上移动并使用鼠标改变方向,但我试图让相机在玩家按住 space吧,但继续前进。

所以有这段代码可以将相机旋转 180 度,但如果我按住 space 条闪烁,就好像它在向前和向后之间切换一样。 我该如何阻止这种情况发生?

private void Update()
{
    if (Input.GetKey(KeyCode.Space) && !globalScript.lookBack)
    {
        globalScript.lookBack = true;
        transform.Rotate(new Vector3(14, 180, 0));
    }
    else { 
        globalScript.lookBack = false;
    }
}

我还试图让玩家始终向前移动,即使摄像机向后看(我已将我的玩家设置为朝摄像机所面对的方向移动)所以换句话说,当玩家向后看时,他们当相机面向前方时,他们仍然沿着相同的方向移动。

我想出了这个方法,可以根据我认为正在工作的相机在前进和前进之间切换,但我认为没有正确访问回溯,我不确定为什么。

Vector3 moveDir; 

if (globalScript.lookBack)
{
    moveDir = Quaternion.Euler(0f, targetAngle, 0f) * -Vector3.forward;
}
else
{
    moveDir = Quaternion.Euler(0f, targetAngle, 0f) * Vector3.forward;
}

 controller.Move(moveDir.normalized * playerMoveSpeed * Time.deltaTime);

我该如何尝试解决这个问题,以便在面向后方时仍然可以向前移动?

你的第二个块几乎每一帧都会触发,包括任何 space 未被按下的帧以及 globalScript.lookBack 为真的任何帧。您需要确保它仅在 lookBack 为真且 space 未被按下时触发。

似乎还存在一个问题,即您的旋转没有设置回之前的位置。如果你改用四元数,这就变得容易了。您可以使用 Quaternion.Inverse 反转您为转身所做的旋转,然后将其应用于旋转

一共:

private void Update()
{
    Quaternion halfRot = Quaternion.Euler(14, 180, 0);
    if (Input.GetKey(KeyCode.Space))
    {
        if (!globalScript.lookBack)
        {
            globalScript.lookBack = true;
            transform.rotation *= halfRot;
        }
    }
    else if (globalScript.lookBack) { 
        globalScript.lookBack = false;
        transform.rotation *= Quaternion.Inverse(halfRot));
    }
}

或者,使用更“平衡”的格式:

private void Update()
{
    Quaternion halfRot = Quaternion.Euler(14, 180, 0);
    if (Input.GetKey(KeyCode.Space))
    {
        if (!globalScript.lookBack)
        {
            globalScript.lookBack = true;
            transform.rotation *= halfRot;
        }
    }
    else 
    {
        if (globalScript.lookBack) { 
        {
            globalScript.lookBack = false;
            transform.rotation *= Quaternion.Inverse(halfRot));
        }
    }
}