C# Unity对象未旋转到鼠标位置

C# Unity对象未旋转到鼠标位置,c#,unity3d,mouse,C#,Unity3d,Mouse,所以我有我从Blackthornprods远程战斗youtube视频中得到的脚本,因为我是初学者。我试图让我的武器围绕我的球体游戏对象旋转,但出于某种原因,它不会旋转到鼠标位置,但当我跳转时,它会奇怪地旋转,不是真的旋转到鼠标,而是随机旋转(我假设是随机的)。我的游戏是3D的,他的教程是2d的。我真的很感激任何寻求解决办法的尝试。这是我的密码: void Update() { Vector3 difference = Camera.main.ScreenToWorldPoint(Inpu

所以我有我从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
,这是一个昂贵的操作,因此(),您应该尽可能少地调用它并缓存结果:

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);
然后,假设对象的“前面”指向局部向上方向之外,可以使用可选的第二个参数
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);
}

谢谢你的快速回复。我在脚本中实现了代码,但武器在播放器上旋转不正确。我想我可能解释错了,但我希望武器只绕z轴旋转。对此表示歉意。我也不明白vector3.dot是做什么的,我试着输入一个z值,但它给了我一个错误,说dot接受3个参数。也许这是一个非常简单的修复方法,但我大约在2个月前才开始…@Moodie箭头指向对象前面的颜色是什么?@Moodie也有两个参数,所以我不确定你在说什么。@Moodie我编辑了我的问题,以解决你的问题含糊不清的两种可能性。希望其中一个适用于你的情况。从问题中的数学来看,我推断后者可能对你更有帮助。如果我使用旋转工具,我想围绕蓝色圆圈旋转。把它想象成一个自上而下的射手,但我把它做成了3d,有点像brackeys的《星球大战》。
我的游戏是3d的,他的教程是2d的,首先,您需要清楚地定义3D对象对2D鼠标输入的反应,因为目前还不清楚预期结果是什么样子。@derHugo我希望武器使用z旋转围绕玩家旋转。我不确定这是否有意义,但是。。