本文简要分析了Unity中射线检测的基本原理及用法,包括:

  • Ray 射线
  • RaycastHit 光线投射碰撞信息
  • Raycast 光线投射
  • SphereCast 球体投射
  • OverlapSphere 相交球等

项目地址Raycast - SouthBegonia



Ray 射线

  • 含义:官方解释为一条无穷的线,开始于origin点,朝向direction方向(但是,根据项目验证来看其默认长度为单位向量,只有对direction进行乘以倍率,才可实现延长射线,而非无穷)
  • 用法:
    • Ray ray = new Ray(transform.position,transform.forward):从物体中心创建一条指向前方的射线ray
    • Ray camerRay = Camera.main.ScreenPointToRay(Input.mousePosition):产生一条从摄像机产生、经过屏幕上光标的射线。当相机为perspective模式,射线在相机梯形视野内发散;若为orthoGraphic,则为垂直与相机面的直线段(见上图)

RaycastHit 光线投射碰撞信息

  • 含义:取得从Raycast函数中得到的碰撞信息(注意不是collider哈,是包含collider信息)
  • 关键变量:point、collider、rigidbody、transform

检测方法 - 线型检测

Physics.Raycast 光线投射

  • 功能:在已有一条射线(也可无)的基础上,使用射线(新建射线)进行一定距离内的定向检测。可修改射线长度,限制其检测的Layer层,并且可以得到射线检测到的碰撞信息。但仅能检测到第一个被射线碰撞的物体,后面的物体无法被检测到
  • 用法:
    • Raycast(transform.position, Vector.forward, distance, LayerMask.GetMask("Enemy")): 从物体中心点起,朝向Vector3.forward方向发射一条射线,该射线长度为distance,射线可检测到的层为Enemy层,返回bool类型
    • Raycast(transform.position, Vector.forward, distance, out RaycastHitInformation ,LayerMask.GetMask("Enemy")):从物体中心点起,朝向Vector3.forward方向发射一条射线,该射线长度为distance,将碰撞信息反馈到RaycastHitInformation上,射线可检测到的层为Enemy层,返回bool类型
    • Raycast (MyRay, distance, LayerMash.GetMask("Enemy")):从已有的射线MyRay出发,长度延伸至distance,射线可检测到的层为Enemy层,返回bool类型
    • Raycast (MyRay, out RaycastHitInformation, distance, LayerMask.GetMask("Enemy"))
  • 适用场合:配合相机坐标转换实现各类交互

Physics.RaycastAll 所有光线投射

  • 功能:机理用法大致同Raycast,当区别在于可检测射线路径上的所有物体,返回检测信息的数组。其他带All后缀的方法也同理
  • 用法:
    • RaycastHit[] hits = RaycastAll(Vector3.zero, Vector.forward, distance, LayerMask.GetMask("Enemy"))
    • RaycastHit[] hits = RaycastAll(MyRay, distance, LayerMash.GetMask("Enemy"))
  • 适用场合:穿透性检测

Physics.Linecast 线段投射

  • 功能:建立某两点之间的射线进行检测,返回bool类型
  • 用法:
    • Linecast(startPos, endPos, LayerMask.GetMask("Enemy"))
    • Linecast(startPos, endPos, out RaycastHit, LayerMask.GetMask("Enemy"))
  • 适用场合:特定地点局部距离射线检测

检测方法 - 体型检测

Physics.SphereCast 球体投射

  • 功能:扩展检测范围为球形,返回bool类型。但是该投射用法需要万分小心,见下
  • 用法:
    • SphereCast (originPos, radius, direction, out RaycastHit, distance, LayerMask.GetMask("Enemy")):含义是在originPos点创建半径为radius的球体;以朝向direction方向的球面为起始面(另一面舍弃),移动distance距离,期间半球面经过的区域即为检测区域。那么originPos到originPos+radius内的半球区域呢?答案是舍弃,用官方的话来说,是边界而不是包围体。(立体结构:以左右球球心为轴线,建立半径为radius、高为distance的圆柱体,左球挖去右半体积,右球添加右半体积)
    • SphereCast (Ray, radius, out RaycastHit, distance, LayerMask.GetMask("Enemy"))
  • 适用场合:检测目的地是否可抵达,从而判断可移动性

Physics.Boxcast 块体投射/ CapsuleCast 胶囊体投射

  • 功能:同球体投射
  • 用法:同球体投射

Physics.OverlapSphere 相交球

  • 功能:同样检测球形,但与SphereCast存在较大区别
  • 用法:
    • Collider[] hits = Physics.OverlapSphere(startPos, radius, LayerMask.GetMask("Enemy")):以startPos为原点,创建半径为radius的球形,检测区域为整个球形包围体(实心),检测Enemy层上的物体,返回所有碰撞物体的collider而不是RaycastHit
  • 适用场合:检测挂载物体球形范围内是否存在碰撞,常用方法

Physics.IgnoreCollision 忽略碰撞

  • 功能:屏蔽两个collider的碰撞,第三个参数为bool
  • 用法: IgnoreCollision (collider1, collider2, ignore)

参考

Unity - Raycast 射线检测的更多相关文章

  1. Unity射线检测的用法总结

    RayCast 射线检测 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心 ...

  2. unity射线检测

    unity中射线检测时非常实用也经常实用的一种手段.下面讲解一下射线检测问题. 1)Ray 根据射线端点和射线的方向定义一条射线 Ray ray= new Ray(transform.position ...

  3. 日常小节----unity小坑记(射线检测固定层级)

    unity中射线检测需设定所需层级时,必须加上距离!!! //一条从主相机到屏幕点击点的射线 Ray ray = Camera.Main.ScreenPointToRay(Input.mousePos ...

  4. Unity3D_(API)射线检测Raycast()

    Unity射线检测官方文档: 传送门 一.检测前方是否有游戏物体(射线无限长度) 二.检测前方是否有游戏物体(射线长度为1m) 三.检测前方游戏物体碰撞信息(射线无限长度): 四.指定检测碰撞Tag层 ...

  5. Unity——射线检测(鼠标点击开关门效果)

    Unity射线检测--实现简单的开关门效果 简要:通过鼠标点击来发射一条射线,来获得射线所碰到的物体名称,再通过改变门的Rotation值来实现开关门的效果. 一.代码实现 1.1 简易的场景搭建 注 ...

  6. Unity的学习笔记(射线检测)

    首先,射线检测的API是这样的,网上找了一下,这个图片看得很清楚: 接下来是自己使用这个进行测试 using System.Collections; using System.Collections. ...

  7. 浅析射线检测 raycast 的使用 !Cocos Creator 3D !

    哎呀?为什么我设置了节点点击回调没反应呀? 记得在写小鸡拍拍的时候遇到一个问题,想要捕捉排球的点击事件,按照 2d 的写法,给3d 节点添加 node 事件,结果点了没反应.代码大概是以下的样子. t ...

  8. pico g2 触摸板手柄射线检测---for unity

    1.pico g2手柄射线检测UI,需要在canvas添加Graphic Raycaster脚本和Pvr_Ui Canvas脚本. 2.删除掉原有的maincamera,将Pvr_unitySDK下h ...

  9. 【Unity3D】枪战游戏—发射子弹、射线检测

    一.子弹的碰撞检测: 因为子弹的移动速度非常的快,那么如果为子弹添加一个collider,就有可能检测不到了. 因为collider是每一帧在执行,第一帧子弹可能在100米处,那么下一帧就在900米处 ...

随机推荐

  1. 用101000张食物图片实现图像识别(数据的获取与处理)-python-tensorflow框架

    前段时间,日剧<轮到你了>大火,作为程序员的我,看到了另外一个程序员—二阶堂,他的生活作息,以及饮食规律,让我感同身受,最让我感触的是他做的AI聊天机器人,AI菜品分析机器人,AI罪犯分析 ...

  2. Spring+Mybatis整合的练手小项目(一)项目部署

    声明:教程是网上找的,代码是自己敲的 项目目录大致如下: 1. 首先创建Maven工程,在pom.xml中加入项目所需依赖: <?xml version="1.0" enco ...

  3. charles 远程映射到URL地址

    本文参考:charles 映射到远程URL地址 远程映射/Map Remote Settings 功能:把你要请求的地址,映射到一个远程地址:相当于把你的请求地址修改了: 远程映射工具 远程映射工具根 ...

  4. /bin/java: 没有那个文件或目录spark/bin/spark-class:行71: /usr/java/jdk1.8

    1.检查java环境有没有问题 2.1没问题后检查文件的编码是否有问题

  5. C++基础之IO类

    下面是IO类的继承关系: ifstream和istringstream都继承自istream.因此,我们可以在传递istream对象的地方传递ifstream和istringstream. 例如:对i ...

  6. 一篇文章了解Redis数据库

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. redis是一个key-value存储系统.它支持存储的value类型相对更多,包括string(字符串).l ...

  7. 主动降噪技术(ANC)的前生今世--原理仿真

    一 原理: 主动降噪就是通过反相检测麦克风的声音或噪声来减弱周围环境的噪声让扬声器出来的声音听起来更清晰.主动降噪技术的目标就是通过一个自适应滤波器把不想要的噪声反相从而把噪声约束到固定的范围内.该系 ...

  8. js禁止刷新的简单方法

    //禁止用F5键  这个是键盘按下时触发document.onkeydown = function() { if ( event.keyCode==116) {event.keyCode = 0; e ...

  9. helm部署Filebeat + ELK

    helm部署Filebeat + ELK 系统架构图: 1) 多个Filebeat在各个Node进行日志采集,然后上传至Logstash 2) 多个Logstash节点并行(负载均衡,不作为集群),对 ...

  10. Linux 常用解压和压缩命令

    .tar 解包 tar xvf filename.tar.tar 打包 tar cvf filename.tar dirname.gz 解压1 gunzip filename.gz.gz 解压2 gz ...