Unity 3D перемещает объект по орбите с помощью пользовательского ввода - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть космический корабль, который летит вокруг орбиты планет по этому сценарию:

Update() {
    transform.RotateAround(planet.transform.position, Vector3.up, speed * Time.deltaTime);
}

Но я не понимаю, как добавить пользовательские входные данные (Input.GetAxis ("Horizontal") и Input.GetAxis («Вертикально»)) к этому сценарию, чтобы пользователь мог контролировать движение космического корабля.Как я могу перемещать космический корабль по орбите, используя пользовательский ввод (стрелки)?

РЕДАКТИРОВАТЬ: Камер следует за кораблем сзади.Корабль продвигается вперед по некоторой силе (скорости) на орбите планеты (для простоты, это просто круг).Я хочу, чтобы пользователь мог изменять направление движения (влево / вправо), как в пекции (с D1 на D2).

Example

Space Ship on planets orbit

1 Ответ

0 голосов
/ 23 декабря 2018

Это задание можно разбить на две части.Сначала вращается корабль на основе пользовательского ввода.Второе - изменить наш метод обращения на орбиту, чтобы учесть вращение корабля, чтобы он двигался в направлении, в котором он стоит.

Мы можем решить первую часть, используя вызов Transform.Rotate.Поскольку мы хотим, чтобы днище корабля всегда было обращено к планете, мы хотим вращаться вдоль оси «Вверх» корабля.Для нашей входной оси «Горизонтальный», вероятно, будет наиболее интуитивным.Это будет выглядеть примерно так:

transform.Rotate(Vector3.forward, Input.GetAxis("Horizontal") * rotateSpeed * Time.deltaTime);

Для второй части важно понимать, что Transform.RotateAround использует пространство мира, а не локальное пространство.Заставив его использовать локальное пространство корабля, он будет учитывать вращение корабля так, что судно будет двигаться в том направлении, в котором оно находится, а не в независимом направлении.Мы можем сделать это с помощью функции Transform.TransformDirection.Это будет выглядеть примерно так:

transform.RotateAround(planet.transform.position, transform.TransformDirection(Vector3.up), speed * Time.deltaTime);

Объединение их в функцию обновления сработало для меня в быстром тесте.


Кроме того, если мы хотим, чтобы корабль отошел отиз стороны в сторону, не делая локального поворота корабля, мы можем сделать это с помощью другого вызова Transform.RotateAround, например:

transform.RotateAround(planet.transform.position, transform.TransformDirection(Vector3.right), Input.GetAxis("Horizontal") * strafeSpeed * Time.deltaTime);

(Ответ отредактирован для редактирования вопроса)

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