unity3d 如何使我的球员面对光标,即使我是围绕球员旋转?

oiopk7p5  于 2022-11-25  发布在  其他
关注(0)|答案(2)|浏览(171)

我想让玩家在3d游戏中面对光标,为此我在玩家中添加了以下代码

void Update()
{
    Vector3 objectPos = cam.WorldToScreenPoint(transform.position);

    mousePos.x = mousePos.x - objectPos.x;
    mousePos.y = mousePos.y - objectPos.y;

    float angle = Mathf.Atan2(mousePos.y, mousePos.x) * Mathf.Rad2Deg;

    transform.rotation = Quaternion.Euler(new Vector3(0, 90- angle, 0));

}

当摄像头正对着玩家时,这是有效的,但当我转过玩家时,它不再跟随光标。当我停止时(例如摄像头现在在玩家后面或左边),玩家旋转面对错误的位置。

t9aqgxwy

t9aqgxwy1#

您需要将摄影机旋转添加到最终旋转的计算中。

[SerializeField] Camera cam;
[SerializeField] Vector3 rotOffset;

void Update()
{
  Vector3 objectPos = cam.WorldToScreenPoint(transform.position);
  Vector2 mousePos = Input.mousePosition;
  mousePos.x = mousePos.x - objectPos.x;
  mousePos.y = mousePos.y - objectPos.y;

  float angle = Mathf.Atan2(mousePos.y, mousePos.x) * Mathf.Rad2Deg;

  transform.rotation = cam.transform.rotation * Quaternion.Euler(new Vector3(0, 0, angle)) * Quaternion.Euler(rotOffset);
}

我已经将初始旋转偏移提取到一个单独的变量中。您可能需要重新调整它以获得正确的方向,并可能更改angle所影响的轴。还要注意,四元数乘法会考虑操作顺序。只有在旋转完全错误时才切换它。

dddzy1tm

dddzy1tm2#

解决方案是,我需要添加y轴的相机Angular 到90度偏移,如下所示:

transform.rotation =  Quaternion.Euler(new Vector3(0, (cam.transform.eulerAngles.y+90)-angle, 0)) ;

现在玩家总是面对光标,即使我转过身来

相关问题