文章目录
- 1. 定义
- 2. 重要类和方法
- 2.1 Ray
- 2.2 从屏幕发出射线:
- 2.3 Raycast
- 2.4 RaycastAll
- 2.5 RaycastHit 碰撞信息
- 2.6 layerMask 让射线检测只检测指定层级的对象
1. 定义
在Unity中,射线检测(Raycasting)是一种常用的技术,用于检测射线是否与场景中的物体相交。这在游戏开发中用于实现点击物体、射线武器的碰撞检测、角色与环境的交互等方面非常有用。
2. 重要类和方法
2.1 Ray
定义:表示从一个点沿着特定方向延伸的虚拟线段
属性:
direction 射线的方向。
origin 射线的原点。
构造函数:
public Ray (Vector3 origin, Vector3 direction);
在场景中绘制射线(仅在 Debug 下可见):
// 创建射线
Ray ray = new Ray(Vector3.zero, Vector3.forward);
// 在场景中绘制射线,可选操作(仅用于调试目的)
Debug.DrawRay(ray.origin, ray0.direction * 10f, Color.red);
2.2 从屏幕发出射线:
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
void Update()
{
if (Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Debug.DrawRay(ray.origin, ray.direction * 10f, Color.red);
}
}
2.3 Raycast
定义:射线检测获取相交的单个物体,它可以检测射线是否与某个物体相交,如果相交,还可以获取有关交点的信息
bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance, int layerMask);
参数含义:
Ray——射线对象
RaycastHit——碰撞(相交)对象信息
maxDistance——射线检测的最大距离
layerMask——层蒙版(用于只检测特定层对象)
返回值含义:
bool——当射线和物体相交时返回true
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo))
{
// 射线与物体相交
Debug.Log($"Name:{hitInfo.collider.name},Point:{hitInfo.point}");
}
}
}
2.4 RaycastAll
定义:射线检测获取相交的多个物体
RaycastHit[] RaycastAll(Ray ray, float maxDistance, int layerMask);
RaycastHit[]——当射线和物体相交时,返回相交的物体们,如果没有碰撞到,数组长度为0
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit[] hitInfos;
hitInfos = Physics.RaycastAll(ray, int.MaxValue);
// 射线与物体相交
foreach (var item in hitInfos)
{
Debug.Log($"Name:{item.collider.name},Point:{item.point}");
}
}
}
2.5 RaycastHit 碰撞信息
2.6 layerMask 让射线检测只检测指定层级的对象
LayerMask.NameToLayer(层名)
:根据层名字转换为层编号的方法
层编号:
1 << LayerMask.NameToLayer(“Cube”)
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
// 1 << LayerMask.NameToLayer("Cube") 将 1 左移得到的层级编号位数,得到层级编号的二进制
if (Physics.Raycast(ray, out hitInfo, int.MaxValue, 1 << LayerMask.NameToLayer("Cube")))
{
// 射线与物体相交
Debug.Log($"Name:{hitInfo.collider.name},Point:{hitInfo.point}");
}
}
}