当玩家按住 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));
}
}
}
我正在统一创建一个游戏,玩家可以使用箭头键在地图上移动并使用鼠标改变方向,但我试图让相机在玩家按住 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));
}
}
}