利用Unity3D引擎制作游戏或应用时,在复杂的场景中,经常需要鼠标点击指定模型或模型部位来完成交互操作,通常我们需要利用射线检测来进行,来查看一条射线是否与场景中的碰撞体相交。
射线检测可以用来实现很多不同的功能,如点击选择物体、射击命中检测等,需要用Physics.Raycast() 方法来实现。
public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance, int layerMask);
其中:
ray :射线碰撞检测的光线。
hitInfo:out类型,可得到碰撞检测的返回值。
maxDistance:碰撞检测的射线长度。
layerMask:在指定层上碰撞检测。
我们在进行射线检测时有时需要忽略掉某些物体的碰撞,从而达到检测物体背后的物体的碰撞,这是个时候我们使用LayerMask,LayerMask的设置有下面几种方式:
LayerMask layerMask = 1 << 3;//打开层级3,只检测层级3
LayerMask layerMask = 0 << 3;//关闭层级3
LayerMask layerMask = (1 << 3) | (1 << 4);//打开层级3和4,只检测层级3、4
LayerMask layerMask = ~(1 << 3);//打开除3以外的层级
LayerMask layerMask = ~(1 << 0);//打开所有层
( 注:int32位掩码即LayerMask,等效图层蒙版 == 启用 / 关闭某几层的 LayerMask 位掩码,1表示开启,0表示关闭 。)
LayerMask layerMask = 1 << LayerMask.NameToLayer(“Name”);
LayerMask layerMask = LayerMask.GetMask("Name"); //LayerMask.GetMask("Name")获取的是一个int值
//Debug.Log(layerMask.value);
public LayerMask clickableLayer;//在Unity3D中进行设置
接下来是Unity3D射线检测场景中的指定模型的实现过程。
一、需要在Unity3D中对需要检测的模型进行设置:
1.增加Collider组件(否则可能不会被射线检测到),检查是否覆盖模型。
2.在场景中增加层(Add Layer)为Clickable。
将需要被检测到的模型或模型的部分层级指定为Clickable。
二、编写脚本代码
将操作直接写在Update()中:
public class MouseItemThroughCamera : MonoBehaviour
{
//2.参数hitInfo 为out类型,可得到碰撞检测的返回值;
RaycastHit hit;
//4.参数layerMask 在指定层上碰撞检测(注意是public,不然在脚本属性那儿找不到指定的层,坑)
public LayerMask clickableLayer;
void Update()
{
//1.参数ray 为射线碰撞检测的光线(返回一个从相机到屏幕鼠标位置的光线)
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, 50, clickableLayer.value)) //如果碰撞检测到物体
{
Debug.Log("111");//点击指定模型后需要进行的操作
}
}
}
或单独写为方法后在Update中引用进行后续操作:
void Update()
{
PressureClick();
}
public LayerMask clickableLayer;
public void PressureClick()
{
if (Input.GetMouseButton(0))
{
Ray ray = EMSelectCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
bool raycast = Physics.Raycast(ray, out hit, 500, clickableLayer.value);
if (raycast)
{
Debug.Log("111");//如果点击到指定模型,输出111
}
else
{
Debug.Log("222");//如果没有点击到指定模型,输出222
}
}
}
可以将PressureClick()改为bool函数进行Update()中的判断。
注意:射线检测需要使用层级Layer时,如果不指定射线的长度,忽略层级很可能会不起作用,因此这里使用layerMask时指定射线的maxDistance。
三、将脚本赋给Unity3D中的GameObject(不一定非要挂在检测的模型上)
设置脚本中的clickableLayer为检测模型所在的层级Clickable。
以上操作即可完成指定模型的检测。