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

时间:2017-01-31 04:47:42

标签: c# unity3d unity5

我有一个Unity3D项目。这个项目有一个我创建的预制件(桌面),平面作为能量的顶部。飞机有一个箱子colider和刚体。在桌面上,我有另一个对象。我想仅在桌面(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;
}

这会移动对象,但它也会将对象移动到桌面上方。有没有办法让对象保持在桌面上?

2 个答案:

答案 0 :(得分:3)

听起来你正在寻找的是将mousePosition投影到桌面上。 mousePosition最初位于屏幕空间中(看起来您已经通过ScreenToWorldPoint识别),您需要找到它从屏幕位置点击的表格的位置。

查看Physics.Raycast

一旦有了这一点,你就可以设置对象的变换,尽管你可能想要将垂直分量设置为该对象的常量值而不是结果值。

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

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

希望这有帮助!

答案 1 :(得分:0)

您可以利用现有的Unity code鼠标按下。您可以在单击时进行这些方法,而不是单击鼠标按钮,这可能是一个更简单的路径。

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