Unity3D射线检测

2023-11-18

射线检测主要用于像子弹是否打中物体,捡取物品等情况,本来面向百度想找例子看看, 不过没找到合适的,还是自己总结尝试吧。

以下测试Unity3D版本:2017.4.2f2

射线的检测步骤如下:

1.Ray

这个类为了产生一个射线,如果我们想要场景中某个物体产生一个射线,只需要定义一个ray,给予一个初始位置,以及方向便可以了。

public Ray(Vector3 origin, Vector3 direction);

 

2.RaycastHit

这个类就是为了存储发射射线后产生的碰撞信息。

Unity内部该类的代码,该函数可以存储如下信息:(中文是我个人翻译,仅供参考)

public struct RaycastHit
{
        //The barycentric coordinate of the triangle we hit.//打中三角形的重心坐标
        public Vector3 barycentricCoordinate { get; set; }
        
        //The Collider that was hit.//打中的碰撞体
        public Collider collider { get; }
        
        //The distance from the ray's origin to the impact point.
        //打中后与原始位置的距离
        public float distance { get; set; }
        
        //The uv lightmap coordinate at the impact point.
        //在碰撞点处的uv坐标
        public Vector2 lightmapCoord { get; }
        
        // The normal of the surface the ray hit.//射线撞击处的表面法线
        public Vector3 normal { get; set; }
        
        //The impact point in world space where the ray hit the collider.
        //打到碰撞体后,碰撞点的世界坐标
        public Vector3 point { get; set; }
        
        // The Rigidbody of the collider that was hit. If the collider is not attached to
        // a rigidbody then it is null.
        //达到的刚体,若没有刚体组件,返回空
        public Rigidbody rigidbody { get; }
        
        //The uv texture coordinate at the collision location.
        //碰撞点的uv纹理坐标
        public Vector2 textureCoord { get; }
        [Obsolete("Use textureCoord2 instead")]
        public Vector2 textureCoord1 { get; }
        
        //The secondary uv texture coordinate at the impact point.
        //碰撞点的第二个uv纹理坐标
        public Vector2 textureCoord2 { get; }
        
        //The Transform of the rigidbody or collider that was hit.
        //打中刚体或者碰撞体的Transform
        public Transform transform { get; }
        
        //The index of the triangle that was hit.
        //打中三角形的索引
        public int triangleIndex { get; }
}

有了这个类存储信息,我们便能跟Ray结合起来一起用。怎么结合呢?这就需要找一个函数把Ray打中的物体信息存储到RaycastHit里面,那么就需要找到Physics.Raycast()函数。

 

3.Physics.Raycast()

这个函数返回bool类型,表示打没打中。有多种方法尝试,常见的如下;

public static bool Raycast(Ray ray, RaycastHit hitInfo, float maxDistance , int layerMask);

public static bool Raycast(Ray ray, float maxDistance , int layerMask);

public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance , int layerMask);

public static bool Raycast(Vector3 origin, Vector3 direction, RaycastHit hitInfo, float maxDistance ,int layerMask );

ray:射线;RaycastHit hitInfo 存储信息; float maxDistance 是射线检查碰撞的最大距离;int layerMask 表示碰撞第几层;

注:

  1. 这里 float maxDistance默认值无穷大;
  2. int layerMask默认值为DefaultRaycastLayers,所以两者均可不输入。
  3. 当然如果不想存打中物体的信息,只想判断打中过任意一个物体,也不用输入RaycastHit hitInfo。

 

4.例子

代码如下:

public class emitRay : MonoBehaviour {
    public GameObject origin_1;
    public GameObject target_1;
    void Start () {
        rayTest(origin_1.transform.position, target_1.transform.position);
    }
	
    void rayTest(Vector3 origin_pos, Vector3 target_pos)//初始位置,检测位置
    {
        Vector3 direction = direction = (target_pos - origin_pos).normalized; //方向
        Ray r1 = new Ray(origin_pos, direction);
        // Debug.DrawLine(origin_pos, origin_pos + direction_1 * 10, Color.red);
        RaycastHit hit;
        if(Physics.Raycast(r1, out hit, 10f))//out关键字主要为了不用初始给hit形参赋值
        {
            Debug.Log("打中");
            GameObject m1 = hit.collider.gameObject;
            //...这里就可以提取RaycastHit存储的信息做各种操作了
        }
        else
        {
            Debug.Log("未打中");
        }
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity3D射线检测 的相关文章

  • Unity Cinemachine插件学习笔记,实现单目标和多目标之间切换

    Cinemachine在2017版中正式加入 结合Timeline可以轻松的制作出一下相机动画 相比Unity自带的标准相机 这个Cinemachine插件可操作的变量更多 不同虚拟相机 用来控制相机的 可以平滑转换等 具体可以参考上篇 U
  • Unity3d提升效率的高级技巧(二)

    11 在层次视图中选中某个游戏对象 按快捷键 Cmd Ctrl D 即可复制该对象 对于检视面板中的数组字段也可已同样的方式来复制元素 12 检视面板中所有的颜色字段都是支持复制和粘贴的 只需右键点击颜色字段既可选择操作 13 如果觉得在场
  • Unity编辑器界面概述

    了解界面 如果您对编辑器界面没有非常地了解 那么请花一些时间查看并熟悉 Editor 编辑器 界面 Editor 主窗口由选项卡式窗口组成 这些窗口可重新排列 因此 Editor 的外观可能因项目或者开发者而异 具体取决于个人偏好 Wind
  • Unity编辑器扩展——进度条显示通用方法

    在我们使用Unity编辑器扩展做一些批处理的工具时 通常会需要显示一个进度条 这样不会让Unity一直卡住不动 使得使用者不知道当前的进展 那么如何显示进度条呢 涉及的相关API有 EditorUtility ClearProgressBa
  • unity 读取和写入Excel中文出现乱码解决方法

    在编辑器中读取和写入中文一切正常 发布出来只要是中文就会出现乱码 解决方法 将C Program Files Unity Editor Data Mono lib mono unity 目录下的I18N dll和I18N CJK dll复制
  • unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger),边学边更新

    unity3d 理解刚体 Rigidbody 和碰撞体 Collider 以及触发器 Is Trigger 边学边更新 分类 Unity3D 2014 04 01 16 50 2755人阅读 评论 2 收藏 举报 刚体 Rigidbody
  • unity本地分数排行榜简单解决方案(Json)

    具体效果 大体方法 创建一个分数类Score和一个分数类的容器List
  • 【Unity灯光与渲染技术】Global Illumination全局光照

    本系列主要参考Unity灯光与渲染技术教程Unity Lighting And Rendering 同时会加上一点个人实践过程和理解 分割线 这篇文章主要讲全局光照 在看教程的时候就有一个点不是很理解 就是作者开启物体的static这个选项
  • Unity3D Engine Architecture

    原文 http www umingo de doku php id paper mechs and tanks section03 Architecture To better understand the game s software
  • Input.GetAxis _ Unity3d

    Input GetAxis 获取轴 static function GetAxis axisName string float Description描述 Returns the value of the virtual axis iden
  • [Unity XLua]热更新XLua入门(一)-基础篇

    Aladdin XLua 前言 前段时间腾讯开源了一个内部热更框架XLua在Unity开发群里引起一阵热议 也受到广大开发者的热捧 然后我当然也抱着好奇的心去学习学习 后面也会将扩展之后的工程放在git上 大家一起学习交流 在此感谢XLua
  • 对Unity3D 静态批处理和动态批处理的理解

    Draw Call就是CPU调用图像编程接口 像OpenGL或者 DirectX 简单来说 Draw Call就是由CPU发起的一个命令 添加到一个命令缓冲区 当GPU完成了上一次的渲染任务之后 会从命令缓冲区的命令队列中再取出一个并执行
  • unity的LOD组件

    本文转载自http blog csdn net huutu article details 52106468 LOD是Level Of Detais 的简称 多细节层次 在游戏场景中 根据摄像机与模型的距离 来决定显示哪一个模型 一般距离近
  • Unity3D的四种坐标系

    1 World Space 世界坐标 我们在场景中添加物体 如 Cube 他们都是以世界坐标显示在场景中的 transform position可以获得该位置坐标 2 Screen Space 屏幕坐标 以像素来定义的 以屏幕的左下角为 0
  • Unity3d + NGUI 的多分辨率适配

    移动端的多机型适配 现在要介绍的是 锁链战记 这款游戏的适配方法 这种适配方法是UI是一个基础尺寸 背景是一个基础尺寸 背景比UI多出的部分是一些没有实际作用的部分 这样的适配方式避免了在iPhone5这样的小屏幕上镶边 首先设定UIRoo
  • Ray 并行 python 不会改变列表

    我的问题是 如果我重新分配列表中的项目 以便重新分配发生在并行进程期间 那么在并行进程完成后 更改将恢复到其原始状态 在下面的示例中 为了便于理解而进行了极大简化 我有一个函数将列表元素 NoZeros 0 更改为 鸡 第二个函数将 NoZ
  • 在 EC2 主节点上初始化 Ray 时出错

    我正在使用 Ray 在 AWS EC2 上的 Ubuntu 14 04 集群上运行并行循环 以下 Python 3 脚本在我的本地计算机上运行良好 只有 4 个工作线程 省略了导入和本地初始化 ray init initialize Ray
  • Ray 集群配置 file_mounts 部分不允许启动工作节点

    我正在尝试使用配置文件中的 file mounts 块将少量文件分发到 AWS EC2 上的 Ray 集群中的每个节点 文件挂载 run files 集群启动时仅使用一个主节点 run files 目录的内容已正确复制到该主节点上 但是 所
  • 如何在Python的类中使用光线并行性?

    我想用射线task方法而不是射线actor方法来并行化类中的方法 原因是后者似乎需要改变类的实例化方式 如图所示here https docs ray io en master getting started with ray 下面是一个玩
  • 使用 docker 在 AWS ray 集群上启动简单的 python 脚本

    我发现遵循 Ray 指南在 ray 集群上运行 docker 映像以执行 python 脚本非常困难 我发现缺乏简单的工作示例 所以我有最简单的docker文件 FROM rayproject ray WORKDIR usr src app

随机推荐

  • C++11中的原子操作(atomic operation)

    所谓的原子操作 取的就是 原子是最小的 不可分割的最小个体 的意义 它表示在多个线程访问同一个全局资源的时候 能够确保所有其他的线程都不在同一时间内访问相同的资源 也就是他确保了在同一时刻只有唯一的线程对这个资源进行访问 这有点类似互斥对象
  • AIops | 一文了解日志异常检测

    作者 李旭光 中国农业银行研发中心责编 晋兆雨出品 CSDN云计算头图 付费下载于视觉中国 背景介绍 日志是有关系统运行状态的描述 例如Linux的系统日志 数据库系统的日志以及分布式系统的日志等 日志是运维人员查看系统运行状态 寻找系统故
  • Java Eclipse进行断点调试

    如何调试Java程序 大家最开始学习Java 都会觉得IDE调试好高端有木有 其实很简单了 下文会尽量简单直观的教会你在Eclipse中调试 其他的IDE调试步骤也是类似的 1 在你觉得有错的地方设置断点 在代码行数前 点击右键 注意是右键
  • MATLAB基础语法总结

    主体参照 全网最全MATLAB学习归纳总结 建模学习必备 MATLAB讲解PPT和MATLAB官方帮助文档这里对该教程做一定的完善与汇总 1 MATLAB编辑器常用快捷键 1 1 编辑器窗口操作 编辑器窗口操作 自动整理代码 用鼠标选中代码
  • 【粉丝问答11】如何实现内网穿透

    本文章由网友 邓工 投稿 VX A18665908735 问题描述 起因 最近公司要做一个4G模块带GNSS 全球导航卫星系统 定位功能的产品 上传传感器数据和设备定位数据到服务器上 我们选择了simcom7600G一个支持全球通的4G模块
  • 基于Docker安装的MindSpore-1.2 GPU版本

    技术背景 在前面一篇博客中 我们介绍过MindSpore CPU版本的Docker部署以及简单的案例测试 当时官方还不支持GPU版本的Docker容器化部署 经过MindSpore团队的努力 1 2 0版本的MindSpore GPU终于推
  • XCTF攻防世界Web12道简单题

    0x00 准备 内容 在xctf官网注册账号 即可食用 目录 目录 0x01 view source2 0x02 get post3 0x03 robots4 0x04 backup6 0x05 Cookie7 0x06 disabled
  • SSE3和SSSE3 Intrinsics各函数介绍

    SIMD相关头文件包括 include
  • Linux入门篇-01 台式机安装Linux系统

    材料 台式机 U盘 内存大于8G CentOs7 下载地址 点击跳转 步骤一 U盘启动电脑 启动成功画面 选择第一个 按E 或者 Tab键 进行编辑 vmlinuz initrd initrd img inst stage2 hd LABE
  • 传感器响应时间与滤波器截止频率的关系

    1 传感器响应时间与滤波器截止频率的关系 详细看 https blog csdn net Old Street article details 108087826 2 滤波器中关于截止频率的理解 http www 360doc com co
  • 孤立森林算法(Isolation Forest Algorithm)Python实现

    孤立森林算法 Isolation Forest Algorithm Python实现 孤立森林算法是一种用于检测异常值的无监督机器学习算法 它通过构建一棵随机划分的二叉树来判断数据点的异常程度 以此来识别异常值 本文将介绍孤立森林算法的原理
  • ubuntu20.04 安装 Sophus库 slambook2

    ubuntu20 04 安装 Sophus库 slambook2 slambook2 实践部分 需要我们自行安装 sophus 库 但是相关的依赖很多 而且sophus分为模板类和非模板类两种 安装起来还是比较繁琐的 slambook2中采
  • QT在子线程发送信号给主线程,主线程信号槽函数没有反应的解决办法

    在编写线程时遇到了一个问题 即子线程发送信号给主线程 主线程信号槽函数没有反应 这个问题卡了半天 最终找到解决办法 自己记录一下 问题 在子线程的run函数发送了一个信号 在主函数中定义了一个信号槽函数用来响应这个信号 但是槽函数不执行 修
  • 我要写一篇关于酒店管理系统论文,请说一说酒店管理系统的研究背景

    酒店管理系统的研究背景是指针对旅游业和酒店业的扩大发展 以及客户服务需求的日益增加 许多酒店已经使用酒店管理系统来提高服务质量和管理效率 酒店管理系统的研究着重于通过使用软件和信息技术来有效地管理酒店的各项运营活动 从而提升酒店的服务质量
  • 机器学习之多元线性回归

    1 多元线性回归模型 定义 具有多个特征的线性回归模型 多元线性回归模型 见下图 多元线性回归总结 参数 模型 损失函数 梯度下降算法 见下图 注意 梯度下降算法每次都是同时更新wj和b 2 多维特征 多维特征 x1 x2 xn 其中xj表
  • 【Linux学习笔记】7. Linux文件IO详解(附代码实例)

    Linux文件I O 前置知识 Linux文件I O分为系统IO和标准IO 常用于系统编程 系统I O通过文件描述符 fd 来操作文件 标准I O通过文件流 FILE 来操作文件 Linux下可以使用man命令来查看使用手册 学习和使用这些
  • 数据备份技术知识梳理(建议收藏)

    所谓数据保护技术是指对当前时间点上的数据进行备份 如果说原始数据被误删除了 可以通过备份数据找回或恢复数据 从底层来分 数据保护可以分为文件级保护和块级保护 文件级备份 文件级备份 将磁盘上所有文件通过调用文件系统接口备份到另一个介质上 也
  • 11-7 读写指定大小的字节

    1 字节 一个字节 8 位 例如在 ASCII 码表中 0000 1010 表示换行 若从十六进制角度看 则结果为 0a CLion debug 便是以十六进制查看的字节 2 读字节 fread 函数用于指定字节大小的读取 该函数可读取二进
  • 重启大法好

    在做springMVC服务器的时候 出现解析不了URL 即dispatch映射不了action的时候 1 检查springname servlet xml 2 检查web xml 3 检查注解是否错误 4 重启eclipse 5 重启电脑
  • Unity3D射线检测

    射线检测主要用于像子弹是否打中物体 捡取物品等情况 本来面向百度想找例子看看 不过没找到合适的 还是自己总结尝试吧 以下测试Unity3D版本 2017 4 2f2 射线的检测步骤如下 1 Ray 这个类为了产生一个射线 如果我们想要场景中