在 Unity3D 中将对象旋转到另一个
rotate Object towards another in Unity3D
我已经从 this question 获得了这个功能。我改变了旋转的符号:
void rotateBotConnector()
{
Vector3 diff = (player.transform.position - botConnector.transform.position).normalized;
float rot_z = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg;
botConnector.transform.localRotation = Quaternion.Euler(0f, 0f, -(rot_z - 90f));
}
但问题是,现在我的对象在 XZ 平面上跟随玩家,但是当旋转到一定程度时,向左或向右,对象停止向我的玩家旋转。
为了更好的理解:http://imgur.com/vWaqc31
为什么不直接使用:
var target : Transform;
transform.LookAt(Vector3(target.transform.position.x, target.transform.position.y, transform.position.z);
好像比用欧拉简单多了。通过这种方式,您可以查看目标的 x 和 y,但可以转换您的 z。
此外,我不是欧拉专家,但它似乎仅限于 90 度转弯,我认为这可能是原因:
Quaternion.Euler(0f, 0f, -(rot_z - 90f));
除非你绝对需要通过角度旋转,否则你可能更愿意去操纵对象的前向向量,这样更容易理解逻辑:
void rotateBotConnector()
{
Vector3 targetForwad = botConnector.transform.position - player.transform.position;
targetForward.y= 0f;
targetForward.Normalize(); // <-- this is very expensive function try avoid using it whenever possible
botConnector.forward = Vector3.Lerp(botConnector.forward, targetForward, Time.deltaTime));
}
再说一遍,如果您的 cpu 周期不足,您可能想要尝试计算角度而不是矢量。但在大多数情况下,这是可以的。 (代码需要拼写检查)
我已经从 this question 获得了这个功能。我改变了旋转的符号:
void rotateBotConnector()
{
Vector3 diff = (player.transform.position - botConnector.transform.position).normalized;
float rot_z = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg;
botConnector.transform.localRotation = Quaternion.Euler(0f, 0f, -(rot_z - 90f));
}
但问题是,现在我的对象在 XZ 平面上跟随玩家,但是当旋转到一定程度时,向左或向右,对象停止向我的玩家旋转。
为了更好的理解:http://imgur.com/vWaqc31
为什么不直接使用:
var target : Transform;
transform.LookAt(Vector3(target.transform.position.x, target.transform.position.y, transform.position.z);
好像比用欧拉简单多了。通过这种方式,您可以查看目标的 x 和 y,但可以转换您的 z。
此外,我不是欧拉专家,但它似乎仅限于 90 度转弯,我认为这可能是原因:
Quaternion.Euler(0f, 0f, -(rot_z - 90f));
除非你绝对需要通过角度旋转,否则你可能更愿意去操纵对象的前向向量,这样更容易理解逻辑:
void rotateBotConnector()
{
Vector3 targetForwad = botConnector.transform.position - player.transform.position;
targetForward.y= 0f;
targetForward.Normalize(); // <-- this is very expensive function try avoid using it whenever possible
botConnector.forward = Vector3.Lerp(botConnector.forward, targetForward, Time.deltaTime));
}
再说一遍,如果您的 cpu 周期不足,您可能想要尝试计算角度而不是矢量。但在大多数情况下,这是可以的。 (代码需要拼写检查)