我正在使用Unity 5并制作一些NPC角色的逻辑,这些角色将随机地和动画一起穿过飞机。当角色到达目的地时,3秒后会生成一个新目标。动画师工作正常,寻路也是如此。现在我希望模型面向正确的方向。
我有一个奇怪的问题,模型似乎没有遵循任何传统的关系。首先,它工作得很好,因为旋转几乎是预期的。第二条路径偏离,第三条路径几乎倒退。就好像如果某种程度上模型计算旋转相关的东西,我不知道。
这是我正在使用的代码的一部分:
Vector3 look = targetPosition - transform.position;
Quaternion targetRotation = Quaternion.LookRotation(look.normalized,Vector3.up);
Quaternion newRotation = Quaternion.Lerp(transform.rotation, targetRotation, turnSmoothing * Time.deltaTime);
rb.MoveRotation(newRotation);
我也尝试过设置变换欧拉角度,这段代码:
float turnAngle = Mathf.Atan2( look.z, look.x ) * Mathf.Rad2Deg;
float smoothAngle = Mathf.LerpAngle( transform.eulerAngles.y, -turnAngle, rb.velocity.magnitude * Time.deltaTime );
rb.MoveRotation( Quaternion.Euler( 0, smoothAngle, transform.eulerAngles.z ));
总是一样的结果。我错过了什么吗?我已经阅读了动画师的根运动,但我已经禁用了动画并且模式仍然存在。此外,该模型似乎具有正确的Z方向设置。它让我疯了!!
任何输入都表示赞赏。
答案 0 :(得分:2)
首先,我想说你应该使用Quaternion.Slerp
进行旋转插值。 Lerp
是一个更线性的插值,Slerp
将使旋转看起来更自然。虽然我不认为这是问题所在。
我从来没有真正使用Quaternion
函数,所以对我来说你的代码看起来很好。不过,我可以建议尝试使用Vector3.RotateTowards
甚至transform.Rotate
的方法,他们应该能够让你得到你想要在这里完成的任务。
编辑:我刚刚注意到您在自定义rigidBody.MoveRotation
插值后使用Lerp
。 Unity API声明:
使用Rigidbody.MoveRotation旋转Rigidbody,符合 刚体的插值设置。
因此,RigidBody
已经有了自己的插值,它将尝试对您的自定义插值进行操作。问题可能出在那里,因为您没有明确设置轮换。尝试将目标方向插入MoveRotation
,刚性人会尝试将你带到那里。这不是立即轮换。
答案 1 :(得分:0)
检查您的外观矢量是否接近零长度。如果您觉得根动画会覆盖旋转,请使用简单的多维数据集而不是NPC字符。要调试查找方向,请使用targetRotation而不是newRotation。您可以渲染调试行以将NPC行可视化为目标。祝你好运。
我没有足够的声望点来写这个评论。