分别添加以上块
GreenBoxCollider2DRigidbody2D
黑盒碰撞刚体
黄色Rigidbody2D
蓝色 无
红盒碰撞器2D
然后我们使用下面的代码设置一个2d射线进行测试
private LineRenderer line; Vector3 mousePos = Input.mousePosition; Vector3 screenToWorld = Camera.main.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, -Camera.main.transform.position.z)); Ray2D ray = new Ray2D(screenToWorld, Vector2.up); Debug.DrawRay(ray.origin, ray.direction, Color.blue, 1.0f); RaycastHit2D info = Physics2D.Raycast(ray.origin, ray.direction, 0.1f); if (info.collider != null)//如果发生了碰撞 { GameObject obj = info.collider.gameObject; Debug.Log(obj.name); }
结果是只有绿色和红色可以收到碰撞
然后我们重写 3D 射线以进行新的测试
Vector3 mousePos = Input.mousePosition; Vector3 screenToWorld = Camera.main.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, -Camera.main.transform.position.z - 0.5f)); RaycastHit hit; Ray ray = new Ray(screenToWorld, Vector3.forward); Debug.DrawRay(ray.origin, ray.direction, Color.blue, 1.0f); if (Physics.Raycast(ray, out hit)) { Debug.Log(hit.collider.gameObject.name); }
结果只能检测到黑色
特点1:2D射线只能检测2D碰撞体unity圆形射线检测,同样3D射线只能检测3D碰撞体,射线只能对具有相应碰撞体的物体产生反馈。
复制一个3D黑色方块并将z轴缩小1个单位,然后将原始3D黑色方块放大2.5倍,使小方块在后面
将绿色 2d 块放大 2 倍并将其放置在红色 2d 块的顶部
重复上面的射线操作
无法检测到小黑色方块,无法检测到红色方块
然后我们分别向大、小黑色方块以及绿色和红色方块添加掩模8和9。
// 2d部分 RaycastHit2D info = Physics2D.Raycast(ray.origin, ray.direction, 0.1f, 1<<); // 3d部分 if (Physics.Raycast(ray, out hit, 10f, 1<<9))
再次重复上述动作,可以检测到黑色小方块unity圆形射线检测,也可以检测到红色方块。
如果不设定长度,那么射线就是一条可以无限延伸和任意穿透的直线。 如果未设置指定层,则仅优先考虑最近的碰撞器。 设置掩码后,指定的掩码优先。 反馈层
有时 2D 游戏可能需要检测鼠标、某些道具或角色。 这时候如果用3D射线指向外面进行2D检测,就无法检测到。
所以,唯一的办法就是随时给鼠标一个很短的检测射线游戏运营,比如0.05f,然后改为向上指向,然后用遮罩来确定需要检测的范围贴图笔刷,是否是UI、对象或其他对象。