Unity 对象未旋转到鼠标位置



所以我有从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);
}

最新更新