【问题标题】:How do i rotate the camera 180 Degrees to look back when a player holds down the space bar?当玩家按住空格键时,如何将相机旋转 180 度以向后看?
【发布时间】:2022-02-17 03:23:38
【问题描述】:

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

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

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);

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

【问题讨论】:

    标签: c# unity3d game-development


    【解决方案1】:

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

    似乎还存在一个问题,即您的旋转没有恢复到以前的位置。如果您改用四元数,这将变得很容易。您可以使用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));
            }
        }
    }
    

    【讨论】:

    • 感谢您的帮助,此解决方案现在可以正确旋转相机,我唯一的问题是它应该在保持空间时向后看,然后在释放时向前看,但事实并非如此。但是,如果我记录 bool lookBack 它在未按下空格时打印 false 并且仅当您按住空格时才打印 true。这是有原因的吗?
    • @GinoSesia 我改变了一些东西让它再次向前看
    • 谢谢你,这正是我想要的。感谢您的帮助,谢谢
    • 这个问题没有提到相机的位置,所以我不知道从哪里开始。如果您要到ask a new question 并在其中包含有关该问题的一些信息,我当然可以看一下。
    • here is the question 到相机位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2022-11-14
    相关资源
    最近更新 更多