Unity 关于Ray、RaycastHit、Raycast及其使用

Unity中,我们要进行物理模拟和碰撞检测时,有三个重要的概念Ray、RaycastHit、Raycast。

其中,Ray可以理解为射线,它是一条从起点沿着特定方向延伸的无限长线段。

它的语法是:

Ray(Vector3 origin, Vector3 direction)

它定义了两个参数,一个起点位置和一个方向,通过Ray射线,可以用来模拟子弹、光线、玩家视线等。

RaycastHit可以理解为射线命中信息,他是一个数据结构,用于存储射线投射过程中的结果。当进行射线投射后,如果射线与场景中的物体相交,RaycastHit会存储与射线相交的物体的信息,如下图:

其中常用信息有:

  • collider:相交物体的碰撞器组件。
  • point:相交点的位置。
  • normal:相交点的法线方向。
  • distance:射线起点到相交点的距离。

 一般我们通过使用Physics类的Raycast方法进行射线投射,然后把射线命中信息存储与RaycastHit。

Raycast则可以理解为射线投射,它是Physics类中的一种用于检测场景中物体碰撞的方法。我们使用该方法可以进行射线投射获取碰撞相关信息。

它的语法多大16个,但是我们常用的是:

bool Physics.Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance, int layerMask);

其中, 

  • ray:要投射的射线对象。
  • hitInfo:射线命中信息将存储在这个参数中。
  • maxDistance:射线的最大投射距离。
  • layerMask(可选):用于指定投射检测的层级。

Raycast方法会返回一个bool值,表示射线是否与物体相交。如果相交,射线命中信息将存储在hitInfo参数中。 

综上所述,我们通过结合Ray、RaycastHit、Raycast这三个要素,就能实现非常好用的功能,比如在物理模拟、碰撞检测以及鼠标点击等场景,就有很大用处。

比如:

1、检测射线与物体的碰撞并获取相关信息:

Ray ray = new Ray(origin, direction);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, maxDistance))
{
    // 射线与物体相交,可以获取碰撞点、碰撞法线、碰撞物体信息等
    Vector3 hitPoint = hit.point;
    Vector3 hitNormal = hit.normal;
    if(hit.collider.name=="xx" || hit.collider.tag =="xx")
    {
         //dosomething
    }    
}

2、拾取物体:

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
    // 射线与物体相交,拾取物体
    GameObject pickedObject = hit.collider.gameObject;
    // 然后进行相关控制
}

3、还有特别常用的鼠标点击发射射线检测碰撞:

if (Input.GetMouseButtonDown(0))
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;
    if (Physics.Raycast(ray, out hit))
    {
        // 射线与物体相交,处理鼠标点击事件
        GameObject clickedObject = hit.collider.gameObject;
        //。。。
    }
}

相关推荐

  1. 【名词解释】Unity中的Toggle组件使用示例

    2023-12-08 08:56:01       7 阅读
  2. 【名词解释】Unity中的Scrollbar组件使用示例

    2023-12-08 08:56:01       6 阅读
  3. vue项目使用typescript创建抽象类使用

    2023-12-08 08:56:01       38 阅读
  4. 深入了解Flutter中的Sealed Class使用

    2023-12-08 08:56:01       13 阅读
  5. Unity 关于刚体模拟爆炸效果使用的方法

    2023-12-08 08:56:01       40 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-08 08:56:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-08 08:56:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-08 08:56:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-08 08:56:01       18 阅读

热门阅读

  1. Nmap脚本的基础知识

    2023-12-08 08:56:01       32 阅读
  2. 52. govaluate使用

    2023-12-08 08:56:01       39 阅读
  3. C#使用Matrix类对Dicom图像的放缩

    2023-12-08 08:56:01       44 阅读
  4. LeetCode-15. 三数之和

    2023-12-08 08:56:01       43 阅读
  5. ElasticSearch中的分析器是什么?

    2023-12-08 08:56:01       38 阅读
  6. R语言进行正态分布检验

    2023-12-08 08:56:01       38 阅读
  7. Mongodb中的ObjectId

    2023-12-08 08:56:01       34 阅读
  8. 看图学源码之 CopyOnWriteArraySet源码分析

    2023-12-08 08:56:01       30 阅读
  9. ZooKeeper学习一

    2023-12-08 08:56:01       27 阅读
  10. iSoftBook、Jira、GitLab、TAPT研发管理平台的比较

    2023-12-08 08:56:01       48 阅读
  11. Caddy服务器快速上手

    2023-12-08 08:56:01       37 阅读
  12. 【Angular开发】Angular:2023年最佳实践

    2023-12-08 08:56:01       35 阅读
  13. 用c#实现记事本的功能

    2023-12-08 08:56:01       30 阅读
  14. KVM迁移

    2023-12-08 08:56:01       20 阅读