本文简要分析了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. Admiral(双向BFS + Hash)

    Problem Description Suppose that you are an admiral of a famous naval troop. Our naval forces have g ...

  2. 08 (OC)* 事件的传递和响应机制

    前言:苹果的官方文档<Event Handling Guide for iOS>对事件处理做了非常详尽清晰的解释,建议大家仔细研读 1. iOS中的事件介绍 2. 事件的产生和传递 3. ...

  3. ActiveMQ JMX使用

    一.说明 ActiveMQ使用过程中,可以使用自带的控制台进行相关的操作以及查看,但是当队列数相当多的时候,在查询以及整体的监控上,就可能相当的不便.所以可通过JMX的方式,进行MQ中队列相关指标的以 ...

  4. Scala函数式编程(三) scala集合和函数

    前情提要: scala函数式编程(二) scala基础语法介绍 scala函数式编程(二) scala基础语法介绍 前面已经稍微介绍了scala的常用语法以及面向对象的一些简要知识,这次是补充上一章的 ...

  5. Java查找统计文中字母,单词

    package io; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; imp ...

  6. 基于Babylon.js编写宇宙飞船模拟程序1——程序基础结构、物理引擎使用、三维罗盘

    计划做一个宇宙飞船模拟程序,首先做一些技术准备. 可以访问https://ljzc002.github.io/test/Spacetest/HTML/PAGE/spacetestwp2.html查看测 ...

  7. 2.html5新布局元素

    1.html5的优点: ①对人友好,更加语义化,更直观,增加了代码的可读性. ②对计算机友好,浏览器更容易解析,搜索引擎更容易抓取文档内容. ③代码更加的简洁. 2.新增的布局标签: Article: ...

  8. jenkins构建项目时报错缺少com.sun.image.codec.jpeg包解决方案

    错误日志:error: package com.sun.image.codec.jpeg does not exist 网上找的一个项目,使用的是jdk1.7,除此之外其他服务器配置或是环境配置都是j ...

  9. 使用Hugo,只需5分钟,轻松搭建一个自己的博客

    前面跟大家介绍过hexo这款静态博客系统,功能强大,基本能满足博客的各种需求.今天,我再跟大家介绍一款优秀的静态博客系统,那就是Hugo. Hugo是由Go语言实现的静态网站生成器.简单.易用.高效. ...

  10. php无限级分类实战——评论及回复功能

    经常在各大论坛或新闻板块详情页面下边看到评论功能,当然不单单是直接发表评论内容那么简单,可以对别人的评论进行回复,别人又可以对你的回复再次评论或回复,如此反复,理论上可以说是没有休止,从技术角度分析很 ...