如何使用Input.GetAxis(“ Mouse X / Y”)旋转相机?


13

我想制作一个随鼠标旋转的第一人称相机。

我查看了Input.GetAxis Scripting API页面,并找到了示例代码,该代码已包含在文章的底部。试用后,我意识到,尽管它具有与希望的基本功能相同的功能,但它并不能使相机与xz平面平行,尤其是在圈动鼠标时。片刻之后,相机将处于一个奇怪的角度,并且播放器将完全被破坏!

是否有此代码的快速修复程序会以某种方式限制相机的移动,或者是否有更好的旋转相机的方法?

 using UnityEngine;
 using System.Collections;

     public class ExampleClass : MonoBehaviour {
         public float horizontalSpeed = 2.0F;
         public float verticalSpeed = 2.0F;
         void Update() {
             float h = horizontalSpeed * Input.GetAxis("Mouse X");
             float v = verticalSpeed * Input.GetAxis("Mouse Y");
             transform.Rotate(v, h, 0);
         }
     }

您正在经历的声音听起来像万向节锁定。当您使用欧拉角旋转时会发生这种情况。我必须做一些测试才能提供解决方案。基本上,您需要使用四元数。他们没有遭受万向节锁定的困扰。
模糊逻辑

如何使用四元数进行旋转?我尝试了transform.rotation = Quaternion.Slerp(-Input.GetAxis(“ Mouse X”),Input.GetAxis(“ Mouse X”),Time.deltaTime * freeLookTurningSpeed); ,但这给了我错误。
reincarnationofstackexchange

好吧,我做了一个测试。幸运的是,这不是万向节锁。我将发布解决方案作为您的答案。
模糊逻辑

Answers:


18

问题是您要更新现有的轮播,而不是自己跟踪并替换每次更新。

更新轮换时,它将新轮换与旧轮换相结合,这会导致意外行为。

解决方案是跟踪您累积的轮换并使用新值在每次更新时完全重置轮换。

归功于我在这里找到的答案:Unity答案:如何将相机的z旋转锁定或设置为零

工作代码:

using UnityEngine;
using System.Collections;

public class FirstPersonCam : MonoBehaviour {

    public float speedH = 2.0f;
    public float speedV = 2.0f;

    private float yaw = 0.0f;
    private float pitch = 0.0f;

    void Update () {
        yaw += speedH * Input.GetAxis("Mouse X");
        pitch -= speedV * Input.GetAxis("Mouse Y");

        transform.eulerAngles = new Vector3(pitch, yaw, 0.0f);
    }
}

主要区别:

  • 将偏航角和螺距存储为类成员,而不是局部方法变量,以便您可以跟踪累积值。
  • 使用+ =和/或-=累积每次更新。
  • 使用eulerAngles(每次更新都会覆盖旋转值),而不要使用Rotate(将新的旋转应用于旧旋转)。

别客气。如果我发布的此解决方案解决了您遇到的原始问题,则应接受它作为答案。如果您想获得有关新问题的帮助,则应发布新问题以使事情保持整洁,并且在其他人遇到类似问题时也更有可能帮助您或找到您的问题。注释区域不用于扩展对话框。干杯。
模糊逻辑

0

如果您将相机子级设为空游戏对象该怎么办。然后使用一个脚本管理相对于UP向量的空游戏对象旋转。(MouseX)使用连接到摄像机游戏对象的另一个脚本,您管理相对于右向量(MouseY)的旋转。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.