Unity:利用 射线Ray 检测物体

利用 射线Ray 检测物体


Unity射线(Ray)是通过发射一条射线来检测碰撞体或触发器。不带碰撞器组件的物体时无法检测的,可以在物理设置里取消检测触发器(Edit → Project Setting → Physics/Physics2D)。

Physics.Raycast(origin, direction, out hitInfo, distance, mask)

origin:射线的发射位置;

direction:射线的发射方向。

hitInfo:射线击中的物体信息;

distance:射线距离,缺省表示无限距离;

mask:射线蒙版,表示检测了哪个layer,缺省表示检测所有层。此参数的形式有所要求:

方法一:

int shootableMask = LayerMask.GetMask("Shootable");
Physics2D.Raycast(Ray, out hitInfo, range, shootableMask);

方法二:

int layerNumber;
(1 << layerNumber)  //只检测编号为 layerNumber 的层
~(1 << layerNumber) //不检测编号为 layerNumber 的层,其余的层都检测
(1 << layerNumber) | (1 << layer2Number)  //只检测 2 个层

RaycastHit:存储发射射线后的碰撞信息

常用的成员变量:

collider:与射线发生碰撞的碰撞器;

transform:与射线发生碰撞的碰撞器的Transform;

distance:从射线起点到射线与碰撞器的交点的距离;

normal:射线射入平面的法向量;

point:射线与碰撞器交点的坐标。

常用用法

  1. 发射一条由摄像机向鼠标方向的一条射线;
  2. 获取该射线的碰撞信息;
  3. 获取碰撞的物体,对该物体进行操控。
代码实例
Ray myRay = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机发出一条射线
RaycastHit2D hit = Physics2D.Raycast(new Vector2(myRay.origin.x, myRay.origin.y), Vector2.zero);//射线从鼠标点击屏幕的那个点出发,射到以当前点击位置为原点的坐标系中的垂直于(0,0)的位置,

if (hit.collider)//如果碰到有Collider2D组件的物体,找到该物体
{
    
    
  Debug.Log(hit.transform.name);//打印出碰撞到的节点的名字
  GameObject obj = GameObject.Find(hit.transform.name);
}
//通过 obj 来操作物体

猜你喜欢

转载自blog.csdn.net/qq_33021529/article/details/125357964