Unity 射线检测

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45136016/article/details/132258563