我的玩家的胸骨可以在瞄准时旋转。
现在我想评估一下我应该让胸部旋转多少(最小和最大旋转)。
为此,我允许所有旋转角度并查看了Inspector。
例如,胸部应向左旋转的最小值应为Y = -15。 在Y = -15(在检查器中看到)时,它看起来仍然很自然。
现在我想对此进行编码。
令我惊讶的是,Chest.localRotation.Y与检查器显示的值完全不同。
然后我看了看胸部变量并扩大了视野。 我只是看不到检查器显示的旋转值。
在这种情况下,我应该如何继续?
我正在使用它来旋转骨骼:
Chest.LookAt(ChestLookTarget.position);
Chest.rotation = Chest.rotation * Quaternion.Euler(Offset);
答案 0 :(得分:1)
它不起作用的原因:
Quaternion
不是人类可读的值。
一个Quaternion
始终是唯一的,但在Euler
空间中可以有多个(无限?)不同的表示形式!另一种方法是Euler
始终精确地表示一个Quaternion
值。
如果查看文档,它会明确显示
除非您完全了解四元数,否则请不要直接修改它。
正如您所说,您在检查器中看到的是相对于父级Transform
的{{3}}。
更好地表示,这是产生Euler
的众多可能的Quaternion
输入之一。您在localRotation
的调试中看到的是另一种可能的Euler
表示形式。通常,localEulerAngles
中的Unity也只给您提供值> 0
。
似乎胸部始终只会绕Y
轴旋转,对吧?
如果是这种情况,您可以简单地获得胸部原始正向向量与目标之间的夹角。比Vector3
更容易处理Quaternion
值;)
似乎与localEulerAngles
中的用例相同
// 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);