【问题标题】:Unity3D SpaceShooter Mouse movement while upside downUnity3D SpaceShooter 鼠标上下颠倒移动
【发布时间】:2020-03-02 08:42:12
【问题描述】:

我正在制作一个 3D 太空游戏,你可以在其中驾驶一艘船。它的第一个人来自驾驶舱。 我所有的动作都像一个魅力(W/S = 加速/减速,Q/R = 向左/向右旋转),鼠标移动船。

但如果我使用旋转按钮,鼠标会一直“卡住”。最简单的解释方法是:当我正常飞行时,向上移动鼠标会使相机向上平移,向下平移 - 向下平移。 但是,如果我倒飞,鼠标似乎没有注意到它并以错误的方式平移(倒置)。就像它不知道我的轮换。另一方面,它更奇怪。鼠标在初始旋转时一直在上升,而不是在新的旋转上,我不知道如何解决它。

我基本上想做的也是按Q或E时转动鼠标方向

这是我的旋转/鼠标脚本:

if (Input.GetKey("q"))
     {
         orientationPanel.transform.Rotate(-Vector3.left * 100f * Time.deltaTime);
         cam.transform.Rotate(Vector3.forward * 100f * Time.deltaTime);
         transform.Rotate(Vector3.forward * 100f * Time.deltaTime);
     }

     if (Input.GetKey("e"))
     {
         orientationPanel.transform.Rotate(Vector3.left * 100f * Time.deltaTime);
         cam.transform.Rotate(-Vector3.forward * 100f * Time.deltaTime); 
         transform.Rotate(Vector3.forward * 100f * Time.deltaTime);           
     }

     if (Input.GetMouseButtonDown(0) && Time.time > nextFire)
     {
         nextFire = Time.time + fireRate;
         Fire();
     }

     float mouseX = Input.GetAxis("Mouse X");
     float mouseY = -Input.GetAxis("Mouse Y");

     rotY += mouseX * mouseSensitivity * Time.deltaTime;
     rotX += mouseY * mouseSensitivity * Time.deltaTime;

     rotX = Mathf.Clamp(rotX, -clampAngle, clampAngle);
     rotZ = orientationPanel.transform.rotation.z;

     Quaternion localRotation = Quaternion.Euler(rotX, rotY, rotZ);
     transform.rotation = localRotation;

【问题讨论】:

    标签: unity3d transform mouse


    【解决方案1】:

    您需要始终在本地空间中旋转您的飞船。如果您将鼠标向右移动 - 始终将船头向右移动。 Rotate(axis, angle, Space.Self);

    例如

    Rotate(Vector3.up, rotY, Space.Self);
    Rotate(Vector3.right, rotX, Space.Self);
    

    这也将修复 Q/E 的旋转,因为使用

    Quaternion localRotation = Quaternion.Euler(rotX, rotY, rotZ);
         transform.rotation = localRotation;
    

    您基本上会覆盖使用

    所做的更改
    transform.Rotate(Vector3.forward * 100f * Time.deltaTime);
    transform.Rotate(Vector3.forward * 100f * Time.deltaTime);    
    

    【讨论】:

    • 谢谢它成功了 :D 你能告诉我为什么我的方法没有用吗?我想理解代码而不是仅仅复制它:P
    • 您需要了解什么是全局空间和什么是局部空间。简单地说:全局是相对于 Unity 中虚拟网格的位置和旋转 - 相对于整个世界。局部是相对于对象本身的。如果我在全球范围内将船倒置,他的“左”就变成了“右”。但是当您坐在驾驶舱内时,您的“左”总是在“左”。如果您想将本地“左”转,您需要以某种方式意识到全局空间中“左”的位置。
    • 顺便说一句,如果您将transform.rotation = localRotation; 更改为transform.localRotation = localRotation;,我认为您的方法可能有效,但我不确定
    • transform.localRotation = localRotation;顺便说一句没用。
    猜你喜欢
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多