如何将 3D 对象转向鼠标
How to turn 3D object towards mouse
我想让立方体(或任何其他 3D 对象)朝向鼠标旋转。首先,我在 Whosebug 和 Unity 论坛上寻找答案。我发现了很多工作的变体,但有一些问题——比如当我移动鼠标时意外地围绕 z 轴转动立方体,或者随着鼠标速度的增加将立方体旋转得比我需要的更远。我还发现一些答案太复杂了。
所以,我的目标是:
- 不绕z轴旋转;
- 精确转动鼠标所在的位置;
- 使代码简短。
我仍在学习脚本和 Unity,所以我的回答可能不准确甚至是错误的,但它现在有效。
基本上,代码如下:
public new Camera camera;
public float depth = 5;
private Vector3 whereIsMyMouse;
void Update()
{
whereIsMyMouse = camera.ScreenToWorldPoint(new Vector3(
Input.mousePosition.x,
Input.mousePosition.y,
camera.nearClipPlane * depth));
transform.LookAt(whereIsMyMouse);
}
我使用ScreenToWorldPoint()
所以Unity可以将鼠标的Vector2转换为LookAt()
的Vector3参数。
您可以自由分配给 camera
任何您需要的相机(在 Unity 的 Inspector 面板中),或者您可以通过将变量设为私有并以编程方式将相机添加到它来更改代码:
private new Camera camera;
void Start()
{
camera = Camera.main;
}
你也可以改变depth
让转弯更急。据我了解,它改变了我们正在寻找的Plane
。
要激活脚本,您需要将其附加到对象,例如立方体。
脚本是这样工作的:
让我们添加一个条件来防止鼠标移出 window:
if ((Input.mousePosition.x < Screen.width
&& Input.mousePosition.x > 0)
&& (Input.mousePosition.y < Screen.height
&& Input.mousePosition.y > 0))
{
whereIsMyMouse = camera.ScreenToWorldPoint(new Vector3(
Input.mousePosition.x,
Input.mousePosition.y,
camera.nearClipPlane * depth));
transform.LookAt(whereIsMyMouse);
}
希望对大家有所帮助。随意编辑我的解决方案或添加您的解决方案。
!编辑!
发现此解决方案会产生错误旋转的错误。您可以通过替换
来修复它
transform.LookAt(whereIsMyMouse);
和
transform.LookAt(transform.position - whereIsMyMouse);
我想让立方体(或任何其他 3D 对象)朝向鼠标旋转。首先,我在 Whosebug 和 Unity 论坛上寻找答案。我发现了很多工作的变体,但有一些问题——比如当我移动鼠标时意外地围绕 z 轴转动立方体,或者随着鼠标速度的增加将立方体旋转得比我需要的更远。我还发现一些答案太复杂了。 所以,我的目标是:
- 不绕z轴旋转;
- 精确转动鼠标所在的位置;
- 使代码简短。
我仍在学习脚本和 Unity,所以我的回答可能不准确甚至是错误的,但它现在有效。
基本上,代码如下:
public new Camera camera;
public float depth = 5;
private Vector3 whereIsMyMouse;
void Update()
{
whereIsMyMouse = camera.ScreenToWorldPoint(new Vector3(
Input.mousePosition.x,
Input.mousePosition.y,
camera.nearClipPlane * depth));
transform.LookAt(whereIsMyMouse);
}
我使用ScreenToWorldPoint()
所以Unity可以将鼠标的Vector2转换为LookAt()
的Vector3参数。
您可以自由分配给 camera
任何您需要的相机(在 Unity 的 Inspector 面板中),或者您可以通过将变量设为私有并以编程方式将相机添加到它来更改代码:
private new Camera camera;
void Start()
{
camera = Camera.main;
}
你也可以改变depth
让转弯更急。据我了解,它改变了我们正在寻找的Plane
。
要激活脚本,您需要将其附加到对象,例如立方体。
脚本是这样工作的:
让我们添加一个条件来防止鼠标移出 window:
if ((Input.mousePosition.x < Screen.width
&& Input.mousePosition.x > 0)
&& (Input.mousePosition.y < Screen.height
&& Input.mousePosition.y > 0))
{
whereIsMyMouse = camera.ScreenToWorldPoint(new Vector3(
Input.mousePosition.x,
Input.mousePosition.y,
camera.nearClipPlane * depth));
transform.LookAt(whereIsMyMouse);
}
希望对大家有所帮助。随意编辑我的解决方案或添加您的解决方案。
!编辑!
发现此解决方案会产生错误旋转的错误。您可以通过替换
来修复它transform.LookAt(whereIsMyMouse);
和
transform.LookAt(transform.position - whereIsMyMouse);