Причина, по которой он не работает:
Quaternion
- это не понятное человеку значение.
Один Quaternion
всегда уникален, но может иметьнесколько (бесконечных?) разных представлений в Euler
пространстве!И наоборот, один Euler
всегда представляет ровно одно Quaternion
значение.
Если вы посмотрите на документы, в нем явно сказано:
Не изменяйте это напрямую, если вы не знаетекватернионы наизнанку.
Чем, как сказано, то, что вы видите в инспекторе, это localRotation
по отношению к родителю Transform
.
Лучше сказать, это один из многих возможных Euler
входов, которые приводят к Quaternion
.То, что вы видите в отладке на localEulerAngles
, является другим возможным представлением Euler
.Unity обычно в localEulerAngles
также дает вам только значения > 0
.
Кажется, что сундук в любом случае будет вращаться только вокруг оси Y
, верно?
Если этоВ этом случае вы можете просто получить угол между исходным вектором сундука вперед и целью.Обрабатывать Vector3
значения намного проще, чем Quaternion
с;)
Кажется, что тот же вариант использования, что и в в этом посте
// get the target direction
Vector3 targetDir = ChestLookTarget.position - Chest.position;
// Reset any difference in the Y axis
// since it would change the angle as well if there was a difference I the height
// between the two objects
targetDir.y = 0;
// however you currently rotate
// instead rotate only the Vector3 variable without applying it to the transform yet
Vector3 newDir = Vector3.RotateTowards(Chest.forward, targetDir, RotationSpeed * Time.deltaTime, 0.0f);
// Compare the target direction to the parents forward vector
float newAngle = Vector3.Angle(Chest.parent.transform.forward, newDir);
if (newAngle > MaxRotationAngle)
{
// What should happen if angle gets bigger?
return;
}
// If angle still okey set the new direction
Chest.rotation = Quaternion.LookRotation(newDir);