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