Unity3D SpaceShooter Мышь в движении вверх ногами - PullRequest
1 голос
/ 02 марта 2020

Я делаю трехмерную космическую игру, в которой ты управляешь кораблем. его первый человек из кабины. Все мои движения работают как шарм (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;

1 Ответ

1 голос
/ 02 марта 2020

Вы должны вращать свой корабль всегда в локальном пространстве. Если вы перемещаете мышь вправо - всегда перемещайте нос корабля вправо. 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);    
...