我有一个 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;
}
这会四处移动对象,但也会将对象移动到桌面上方。有没有办法让物体保持在 table 上?
最佳答案
听起来您正在寻找的是将 mousePosition 投影到 table 上。 mousePosition 最初在屏幕空间中(看起来你已经用 ScreenToWorldPoint 识别了),你需要从屏幕位置找到它击中的表格的位置。
一旦有了那个点,您就可以将对象的变换设置为该点,尽管您可能希望将垂直分量设置为该对象的常量值而不是结果值。
为此,您可能需要将表格设置为碰撞层(如果您还没有设置的话)并确保您只是在寻找它。请注意,对于 Raycast,layerMask 是一个寄存器,由一个 int 表示(即 [0 1 2..31]),因此您可以使用按位操作来选择图层,例如
layerMask = (1<<LayerMask.NameToLayer("Table"))
希望这对您有所帮助!
关于c# - Unity3d 沿平面移动对象(仅限 X 和 Z 轴),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41949826/