当一个游戏对象围绕移动的玩家旋转时,如何将它指向另一个游戏对象?

How do I point a gameobject towards another one, while it's rotating around a moving player?

我正在制作一个 space 探索游戏,我试图让一个箭头围绕玩家旋转,指向关卡中心的太阳。这是为了让游戏更具可读性。 “箭头”现在只是一个上面有球体的圆柱体——球体代表箭头点。围绕玩家的旋转正在发挥作用,但我无法让它始终指向太阳。如图所示,箭头指向的方向几乎与我想要的方向相反。

我使用的代码如下

    playerPos = transform.position;
    sunPos = sun.transform.position;

    // Cast ray from player to sun
    Ray ray = new Ray(playerPos, sunPos - playerPos);
    RaycastHit hitInfo;

    if (Physics.Raycast(ray, out hitInfo, 400, mask))
        Debug.DrawLine(ray.origin, sunPos, Color.green);
    Debug.Log("Distance" + hitInfo.distance);
    
    // Rotate arrow around player.
    arrow.transform.position = playerPos + ray.direction.normalized*2;
    // Point arrow towards sun. This is not working
    arrow.transform.rotation = Quaternion.FromToRotation(gameObject.transform.position, sunPos);

除了Quaternion.FromToRotation之外,我还尝试过使用 LookAt,这也给了我奇怪的结果。 (我尝试了所有不同的向上方向,即 LookAt(sun, Vector3.left) 和 (sun, Vector3.back) 等。 希望有聪明的头脑可以提供帮助。提前致谢。

理论

你可以使用

Quaternion.FormToRotation

它通过提供方向向量和“0”向量来创建四元数(处理游戏对象旋转的东西)。有了这些信息,它就会知道如何旋转你的变换。

例子

我会做类似的事情:

Vector3 direction = sunPos - playerPos;
transform.rotation = Quaternion.FromToRotation(direction, Vector3.right);

Vector3.right = (1f,0f,0f) 并且您应该使用箭头的标准方向。例如,如果箭头没有旋转指向上方 (0f,1f,0f),则应使用 Vector3.up insteed.

正如我在评论中所说,您不需要光线投射。 (也许您稍后在代码中需要它)

Vector3 delta = sunPos - playerPos;
Vector3 direction = delta.normalized;
float distance = delta.magnitude;