Как вы правильно заметили LookAt
ожидает координату Vector3
в мировом пространстве .
Ваш сценарий работает так, как ожидалось, если автомобиль невращался сам, потому что в этом случае разница в положении между контроллером и колесом (случайно) находится в направлении Z
.
Но если автомобиль повернут против мира, вы не можете полагаться на простое использование
new Vector3(followGO.transform.position.x, followGO.transform.position.y, steeringWheel.transform.position.z)
, поскольку это не мировая разница Z
, которую вы хотите больше устранить.
Вместо этого вы хотите устранить локальную разницу между контроллером и рулевым колесом в его локальном Y
направление.Вы можете использовать Transform.InverseTransformPoint
для преобразования мировой координаты в локальную пространственную координату и Transform.TransformPoint
для преобразования локальной координаты в мировую космическую координату:
// I just directly used Transform here
// to save a bit of coding later
public Transform steeringWheel;
public Transform followGO;
private void Update()
{
// returns the position of followGO relative to the steeringwheel
// but in the local transform space of the steering wheel itself
var relativePosition = steeringWheel.InverseTransformDirection(followGO.position);
// you want to eliminate the local difference in Y direction
relativePosition.y = 0;
// since you are right and LookAt expects a world position after eliminating the local Y difference
// we convert it back to world space
var targetPosition = steeringWheel.TransformPoint(relativePosition);
steeringWheel.transform.LookAt(targetPosition, steeringWheel.transform.up);
}
Как вы можете видеть, теперь вы можете поворачивать автомобиль так, как вам нравится, и рулевое колесо всегда будет иметь ось Z
, обращенную к контроллеру.

Для сравнения, если хотите: example.unitypackage