我有一个Unity3D项目.该项目具有我创建的预制件(桌面),并以飞机作为顶部.这架飞机有一个箱大肠菌和刚体.在桌面上,我还有另一个对象.我只想围绕桌面(X和Z轴)移动该对象.切勿将物体抬高到桌面上方.我将以下代码附加到我的对象上:
void onm ouseDown()
{
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 onm ouseDrag()
{
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"))
希望这可以帮助!