Unity3d沿平面移动物体(仅限X和Z轴)

3

我有一个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;
}

这会移动物体的位置,但也会将物体移到桌面上方。有没有办法让物体留在桌面上呢?

2个回答

3

看起来你想要的是将鼠标位置投影到桌子上。鼠标位置最初位于屏幕空间中(似乎你已经用ScreenToWorldPoint识别了它),你需要从屏幕位置找到它所击中的桌子位置。

查看Physics.Raycast

一旦你有了那个点,你可以将对象的变换设置为该点,但你可能需要将该对象的垂直分量设置为常数值而不是结果值。

为此,你可能需要将桌子设置为碰撞层(如果你还没有),并确保只寻找它。请注意,使用Raycast时,layerMask是一个寄存器,由int表示(即[0 1 2..31]),因此你可以使用按位运算选择你的层,例如

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

希望这可以帮到你!

0

你可以利用已有的Unity代码来实现鼠标按下功能。你可以将这些方法转变为鼠标点击和未点击鼠标按钮时执行的方法,这可能是一条更简单的路线。

如果你不想考虑碰撞方面(如果桌子是刚体,鼠标对象不应该穿过桌子),在确保它仅在x和Z轴上时,你可以在检查器中冻结Y位置,以便它锁定到你设置的任何水平位置。


你好,没错,我可以很好地实现鼠标事件。但是问题在于如何将对象保持在指定的平面上。我尝试过限制/冻结Y轴位置,但这会导致奇怪的行为。如果你仔细想想,脚本不仅必须移动对象,还必须调整其大小,以使其看起来离相机更近或更远。 - jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接