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