Космический корабль 1-го лица - PullRequest
0 голосов
/ 03 апреля 2020

Я уже некоторое время пытаюсь с разными уроками получить хорошую систему управления космическим кораблем от первого лица (вид из кабины). Я пытался использовать только мышь, только клавиатуру и комбинации, но я продолжаю сталкиваться с одной и той же проблемой во всех уроках. даже эта простая строка кода делает это:

    transform.position += transform.forward * Time.deltaTime * 90f;
    transform.Rotate( Input.GetAxis("Vertical"), Input.GetAxis("Horizontal"), 0.0f);

Проблема, которую я продолжаю получать, состоит в том, что, если я передам это хорошо. это я рыскать это нормально. Но если я сделаю и то, и другое (то есть я go по диагонали), он также вращает мой корабль по оси Z и портит мою ориентацию. Я попытался заблокировать вращение z в жестком теле, но это тоже не помогает. Я пытался создавать код, чередуя его с применением крутящего момента и простого вращения, следуя некоторым учебникам, включая этот: Учебное пособие , но продолжаю сталкиваться с проблемой вращения.

Я хочу создать игру, которая контролирует как в старой игре Хелбендер

Кто-нибудь из вас знает, как я могу заставить работать элементы управления космическим кораблем?

---- РЕДАКТИРОВАТЬ -----

Теперь немного дальше. Он больше не поворачивает мою ось z, потому что я продолжаю устанавливать его на 0. Единственная проблема сейчас заключается в том, что если я пытаюсь сделать зацикливание, корабль переворачивается, а не зацикливается.

        if (Input.GetKey("up"))
    {
        transform.Rotate(transform.right * -ShipPanSpeed * Time.deltaTime, Space.World);
    }

    if (Input.GetKey("down"))
    {
        transform.Rotate(transform.right * ShipPanSpeed * Time.deltaTime, Space.World);
    }

    if (Input.GetKey("left"))
    {
        transform.Rotate(transform.up * -ShipPanSpeed * Time.deltaTime,Space.World);
    }

    if (Input.GetKey("right"))
    {
        transform.Rotate(transform.up * ShipPanSpeed * Time.deltaTime,Space.World);
    }

    float z = transform.eulerAngles.z;
    transform.Rotate(0, 0, -z);

1 Ответ

1 голос
/ 04 апреля 2020

Вы всегда можете попытаться сделать один родительский объект для элементов управления, а затем дочерний объект (пробел), который вы можете вращать для оси, но не можете прикрепить какое-либо движение, кроме вращения.

Я имею в виду, что Вы можете вращать родительский элемент по оси Y, чтобы он вращался и одновременно перемещал преобразование вперед или назад. Если вы хотите повернуть вверх или вниз, вы можете трансформироваться вперед одновременно с трансформацией вверх / вниз, умноженной на ось, с которой вы хотите поворачиваться

Пример:

private void Update(){
  //PARENT--------------------------------------------

  // MOVING FORWARD AND BACKWARD
  transform.position += transform.forward * Input.GetAxis("Vertical") * speed * Time.deltaTime();

  // MOVING RIGHT AND LEFT
  transform.position += transform.right * Input.GetAxis("Horizontal") * speed * Time.deltaTime();

  //PIVOT UP AND DOWN
  transform.position += transform.up * -Input.GetAxis("Mouse Y") * speed * Time.deltaTime();

  //ROTATE AROUND THE Y AXIS
  tranform.Rotate(0f, Input.GetAxis("Horizontal") * rotationspeed, 0f);


}

Для космического корабля ( child) для оси я бы порекомендовал вам сделать пустой объект и настроить чип так, чтобы он смотрел на этот объект на основе входной оси, которую вы используете для перемещения вверх / вниз и вперед / назад.

Надеюсь, это помогло или, по крайней мере, дало вам представление о том, как это сделать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...