Unity3d 沿平面移动对象(仅限 X 轴和 Z 轴)



我有一个Unity3D项目。 这个项目有一个我创建的预制件(桌面),上面有一个平面。 这架飞机有一个箱式抄送器和刚体。 在桌面上,我还有另一个对象。 我只想在桌面(X 和 Z 轴)周围移动此对象。 对象不应高于桌面。 我将以下代码附加到我的对象:

void OnMouseDown()
{
    Debug.Log("mouse down");
    screenPoint = Camera.main.WorldToScreenPoint(transform.position);
    offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
}
void OnMouseDrag()
{
    Debug.Log("mouse drag");
    Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
    Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
    transform.position = curPosition;
}

这会移动对象,但也会将对象移动到桌面上方。 有没有办法将对象放在桌子上?

听起来您要查找的是将mousePosition投影到桌子上。mousePosition最初位于屏幕空间中(看起来你已经用ScreenToWorldPoint识别出来了),你需要找到它从屏幕位置击中的桌子的位置。

查看物理.光线投射

获得该点后,您可以将对象的转换设置为该

点,尽管您可能希望将垂直组件设置为该对象的常量值而不是结果值。

为此,您可能需要将表设置为碰撞层(如果尚未设置),并确保仅查找该图层。请注意,对于 Raycast,layerMask 是一个寄存器,由 int 表示(即 [0 1 2..31]),因此您可以使用按位运算来选择图层,例如

layerMask = (1<<LayerMask.NameToLayer("Table"))

希望这有帮助!

您可以使用现有的 Unity 代码来按下鼠标。您可以将这些方法变成单击和未单击鼠标按钮时,这可能是更简单的路线。

确保它只在 x 和 Z 轴上方面,如果您不想担心碰撞方面(如果桌子是刚体,鼠标对象不应该掉下来),您可以随时冻结检查器中的 Y 位置,以便它锁定到您设置的任何级别。

相关内容

最新更新