我有一个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 位置,以便它锁定到您设置的任何级别。