【问题标题】:How do I point a gameobject towards another one, while it's rotating around a moving player?如何将游戏对象指向另一个游戏对象,同时它围绕移动的玩家旋转?
【发布时间】:2021-01-23 09:46:01
【问题描述】:

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

我使用的代码如下

    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) 等。 希望一些聪明的头脑可以提供帮助。提前致谢。

【问题讨论】:

  • Transform.LookAt 将对象的 Z 轴朝向目标旋转。你能显示箭头的世界坐标和局部坐标吗?
  • 好的,这可以解释很多。我的游戏中没有使用 z 轴。要上传图片
  • 箭头的坐标取决于玩家的坐标。箭头始终位于玩家和太阳“之间”。 Z轴始终为0
  • 您可以将圆柱体和球体对象编辑为沿箭头的 +z 轴。

标签: c# unity3d quaternions raycasting


【解决方案1】:

理论

你可以使用

四元数.FormToRotation

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

示例

我会做类似的事情:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多