Unity 射线检测

文章目录

  • 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}");
        }
    }
}

Unity 射线检测_第1张图片

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}");
        }       
    }
}

Unity 射线检测_第2张图片

2.5 RaycastHit 碰撞信息

Unity 射线检测_第3张图片

2.6 layerMask 让射线检测只检测指定层级的对象

LayerMask.NameToLayer(层名):根据层名字转换为层编号的方法
层编号:
Unity 射线检测_第4张图片
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}");
        }
    }
}

Unity 射线检测_第5张图片

你可能感兴趣的:(Unity,学习笔记,unity,游戏引擎)