当移动到Unity3D中的RaycastHit point时,是否使对象与某些其他对象发生碰撞?

当移动到Unity3D中的RaycastHit point时,是否使对象与某些其他对象发生碰撞?,unity3d,collision-detection,collision,raycasting,Unity3d,Collision Detection,Collision,Raycasting,我正在使用鼠标指针的光线投射制作一个简单的建筑系统。要放置的对象将被移动(并在单击时克隆)到光线的RaycastHit.point,但我希望它与其自身类型的对象完全碰撞,并相对于命中点移动其位置。该对象可以与gif中显示的地形相交,但不应位于已放置的墙砌块内部。我尝试使用hit.distance,但无法确定检测结果,因为对象已定位在碰撞点。我是否应该尝试检测位置相对于命中点应该如何移动,还是应该在网格碰撞器不断移动到RaycastHit.point时以某种方式使其工作 这是一种满足你要求的方法

我正在使用鼠标指针的光线投射制作一个简单的建筑系统。要放置的对象将被移动(并在单击时克隆)到光线的RaycastHit.point,但我希望它与其自身类型的对象完全碰撞,并相对于命中点移动其位置。该对象可以与gif中显示的地形相交,但不应位于已放置的墙砌块内部。我尝试使用hit.distance,但无法确定检测结果,因为对象已定位在碰撞点。我是否应该尝试检测位置相对于命中点应该如何移动,还是应该在网格碰撞器不断移动到RaycastHit.point时以某种方式使其工作


这是一种满足你要求的方法

private void Update()
{
Vector3 hitPosition=Vector3.0;
光线=_camera.screenpointoray(输入.mousePosition);
if(物理光线投射(光线,外光线投射命中))
{
hitPosition=hit.point;//0
if(hit.transform.gameObject.CompareTag(“多维数据集”)//1
hitPosition=计算命中(命中,命中位置);
}
_current.transform.position=hitPosition;
}
专用矢量3计算命中(光线投射命中,矢量3当前位置)
{
var bounds=hit.transform.GetComponent().bounds;//2
Faces face=GetFace(点击);//3
开关(面)
{
箱子正面朝上:
currentPosition+=新矢量3(0,bounds.extensts.x,0);
打破
箱子正面朝下:
currentPosition+=新矢量3(0,-bounds.extents.x,0);
打破
东区:
currentPosition+=新矢量3(bounds.extents.x,0,0);
打破
西区:
currentPosition+=新矢量3(-bounds.extents.x,0,0);
打破
案件面向北:
currentPosition+=新矢量3(0,0,bounds.extensts.x);
打破
案件面向南部:
currentPosition+=新矢量3(0,0,-bounds.extensts.x);
打破
}
返回当前位置;
}
公共脸GetFace(RaycastHit)
{
Vector3 res=hit.normal-Vector3.up;
if(res==新向量3(0,-1,-1))
返回面。南部;
if(res==新向量3(0,-1,1))
返回面。北;
if(res==新向量3(0,0,0))
返回面。向上;
if(res==新向量3(1,1,1))
返回面。向下;
if(res==新向量3(-1,-1,0))
回首往西;
if(res==新向量3(1,-1,0))
回首往东;
回过头来,什么也没有;
}
公共枚举面
{
没有什么,
向上的
下来,,
东方,,
西,
北,
南方
}
我会进一步解释:

在更新方法中,一旦检测到命中点的位置,就可以检查是否瞄准立方体。我不知道实例化后如何管理它们,但我添加了一个名为
cube
的标记。 它可以是任何名称或层。 它也可以是一个组件,并使用
hit.transform.GetComponent()
方法检查该组件是否存在

然后,获得目标立方体边界
//2
,并使用法线确定目标方向
//3

从这里开始,根据目标面(六分之一),在三个轴之一的
命中点上添加偏移量

使用
bounds.extends.x
bounds.extends.y
bounds.extends.z
为您提供一半的面。 您只希望偏移为面长度的一半,因为使用鼠标移动立方体时,立方体的位置位于其中心

以下是一个例子:


这是一种满足你要求的方法

private void Update()
{
Vector3 hitPosition=Vector3.0;
光线=_camera.screenpointoray(输入.mousePosition);
if(物理光线投射(光线,外光线投射命中))
{
hitPosition=hit.point;//0
if(hit.transform.gameObject.CompareTag(“多维数据集”)//1
hitPosition=计算命中(命中,命中位置);
}
_current.transform.position=hitPosition;
}
专用矢量3计算命中(光线投射命中,矢量3当前位置)
{
var bounds=hit.transform.GetComponent().bounds;//2
Faces face=GetFace(点击);//3
开关(面)
{
箱子正面朝上:
currentPosition+=新矢量3(0,bounds.extensts.x,0);
打破
箱子正面朝下:
currentPosition+=新矢量3(0,-bounds.extents.x,0);
打破
东区:
currentPosition+=新矢量3(bounds.extents.x,0,0);
打破
西区:
currentPosition+=新矢量3(-bounds.extents.x,0,0);
打破
案件面向北:
currentPosition+=新矢量3(0,0,bounds.extensts.x);
打破
案件面向南部:
currentPosition+=新矢量3(0,0,-bounds.extensts.x);
打破
}
返回当前位置;
}
公共脸GetFace(RaycastHit)
{
Vector3 res=hit.normal-Vector3.up;
if(res==新向量3(0,-1,-1))
返回面。南部;
if(res==新向量3(0,-1,1))
返回面。北;
if(res==新向量3(0,0,0))
返回面。向上;
if(res==新向量3(1,1,1))
返回面。向下;
if(res==新向量3(-1,-1,0))
回首往西;
if(res==新向量3(1,-1,0))
回首往东;
回过头来,什么也没有;
}
公共枚举面
{
没有什么,
向上的
下来,,
东方,,
西,
北,
南方
}
我会进一步解释:

在更新方法中,一旦检测到命中点的位置,就可以检查是否瞄准立方体