统一对象不旋转到鼠标位置

Unity object not rotating to mouse position

所以我有脚本,这是我从 Blackthornprods 远程战斗 youtube 视频中获得的,因为我是初学者。我试图让我的武器围绕我的球体游戏对象旋转,但由于某种原因它没有旋转到鼠标位置所在的位置,但是当我跳跃时它奇怪地旋转而不是真正地旋转到鼠标而是随机旋转(我假设随机)。我的游戏是 3D 的,而他的教程是 2D 的。我真的很感激任何解决方案的尝试。这是我的代码:

void Update()
{
    Vector3 difference = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
    float rotZ = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
    transform.rotation = Quaternion.Euler(0f, 0f, rotZ + offset);

}

武器还是绕着Z轴旋转

首先,Camera.main调用FindGameObjectsWithTag,这是一个昂贵的操作,所以(as the documentation says),你应该尽可能少地调用它并缓存结果:

Camera mainCam;

void Awake()
{
    mainCam = Camera.main;
}

其次,您使用 ScreenToWorldPoint 不正确。如果这真的是问题描述的 3d 游戏,您应该提供相机的深度作为参数的 z 分量。您可以使用矢量数学来执行此操作,结果是您可以将光标视为所在的世界位置。:

Camera mainCam;

void Awake()
{
    mainCam = Camera.main;
}

void Update()
{
    float objectDepthFromCamera = Vector3.Dot(
            transform.position - mainCam.transform.position, 
            mainCam.transform.forward); 

    Vector3 cursorWorldPosition = mainCam.ScreenToWorldPoint(Input.mousePosition 
            + Vector3.forward * objectDepthFromCamera);

然后假设对象的 "front" 指向局部向上方向,您可以使用 Quaternion.SetRotation 的可选第二个参数来设置旋转,以便指向光标:

Camera mainCam;

void Awake()
{
    mainCam = Camera.main;
}

void Update()
{
    float objectDepthFromCamera = Vector3.Dot(
            transform.position - mainCam.transform.position, 
            mainCam.transform.forward); 

    Vector3 cursorWorldPosition = mainCam.ScreenToWorldPoint(Input.mousePosition 
            + Vector3.forward * objectDepthFromCamera);

    transform.rotation = Quaternion.LookRotation(Vector3.forward,
            cursorWorldPosition - transform.position);
}

如果物体前面指向局部右方向,可以用Vector3.Cross判断局部向上应该指向什么方向:

Camera mainCam;

void Awake()
{
    mainCam = Camera.main;
}

void Update()
{
    float objectDepthFromCamera = Vector3.Dot(
            transform.position - mainCam.transform.position, 
            mainCam.transform.forward); 

    Vector3 cursorWorldPosition = mainCam.ScreenToWorldPoint(Input.mousePosition 
            + Vector3.forward * objectDepthFromCamera);

    Vector3 localUpNeeded = Vector3.Cross(Vector3.forward, 
            cursorWorldPosition - transform.position);

    transform.rotation = Quaternion.LookRotation(Vector3.forward, localUpNeeded);
}