Unity 之`Physics.Raycast()`方法,射线检测

news2025/4/19 0:13:03

文章目录

  • 总述
    • 参数解释
    • 形参
      • 前两个变量可以用Ray 来代替
    • 返回值

在这里插入图片描述

总述

当你在Unity中使用Physics.Raycast()方法时,你实际上是在进行一种射线检测,以查看一条射线是否与场景中的碰撞体相交。这可以用来实现很多不同的功能,如点击选择物体、射击命中检测等。以下是Physics.Raycast()方法的详细介绍:

public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal)

参数解释

参数解释:

  • origin:射线的起点(3D世界坐标)。
  • direction:射线的方向(3D向量),通常应该是标准化的向量。
  • hitInfo:用于存储射线命中信息的RaycastHit结构的实例。如果命中发生,这个结构将包含有关命中的各种信息。
  • maxDistance:射线的最大长度。这是射线从起点向方向延伸的最大距离。如果射线未与碰撞体相交,或相交点距离起点超过最大距离,那么命中将被认为未发生。默认值为正无穷大(Mathf.Infinity)。
  • layerMask:一个可选的层级遮罩,用于指定射线应该检测哪些碰撞体。只有在指定的层级上的碰撞体会被考虑在内。默认为DefaultRaycastLayers,这通常是场景中的所有层级。
  • queryTriggerInteraction:一个枚举,用于控制射线是否应该与触发器碰撞体发生作用。你可以选择忽略触发器碰撞体,仅与非触发器碰撞体交互,或者与所有碰撞体都进行交互。默认为QueryTriggerInteraction.UseGlobal

形参

Physics.Raycast() 方法有五个必须的形参,以及两个可选的形参。以下是这些形参的详细说明:

  1. origin(必须):

    • 类型:Vector3
    • 描述:射线的起点,即射线发出的位置。
  2. direction(必须):

    • 类型:Vector3
    • 描述:射线的方向,通常应该是标准化的向量。
  3. hitInfo(必须):

    • 类型:out RaycastHit
    • 描述:用于存储射线命中信息的 RaycastHit 结构的实例。如果命中发生,这个结构将包含有关命中的各种信息。
  4. maxDistance(必须,可选):

    • 类型:float
    • 默认值:Mathf.Infinity
    • 描述:射线的最大长度。这是射线从起点向方向延伸的最大距离。如果射线未与碰撞体相交,或相交点距离起点超过最大距离,那么命中将被认为未发生。
  5. layerMask(必须,可选):

    • 类型:int
    • 默认值:DefaultRaycastLayers
    • 描述:一个可选的层级遮罩,用于指定射线应该检测哪些碰撞体。只有在指定的层级上的碰撞体会被考虑在内。
  6. queryTriggerInteraction(必须,可选):

    • 类型:QueryTriggerInteraction
    • 默认值:QueryTriggerInteraction.UseGlobal
    • 描述:一个枚举,用于控制射线是否应该与触发器碰撞体发生作用。你可以选择忽略触发器碰撞体,仅与非触发器碰撞体交互,或者与所有碰撞体都进行交互。

注意 前两个变量 射线的起点以及方向可以用 Ray 类型的变量来代替

前两个变量可以用Ray 来代替

Physics.Raycast() 方法的前两个形参分别是射线的起点和方向。这两个形参可以用一个完整的Ray对象来代替,因为Ray对象包含了起点和方向信息,从而更方便地表示一个射线。

Ray是一个Unity中的结构体,它包含了射线的起点和方向。当你在调用Physics.Raycast()时,你可以直接传递一个Ray对象作为第一个形参,而不需要单独提供起点和方向。

这种方式的好处是:

  1. 更简洁: 你不需要在每次调用Physics.Raycast()时单独提供起点和方向,而是将它们合并成一个Ray对象,使代码更简洁。
  2. 更可读: 传递一个Ray对象可以使代码更易读,因为它更清楚地表示了这是一个射线,并且将起点和方向联系在一起。

以下是使用Ray对象的示例:

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);  // 创建一个射线
if (Physics.Raycast(ray, out hitInfo, maxDistance)) {
    // 射线命中了某个物体
    // 在这里可以处理命中的物体信息
}

在这个示例中,我们创建了一个Ray对象,该对象代表了从主摄像机发出的射线,起点和方向都在ray对象中得到了体现。然后,我们将这个Ray对象传递给Physics.Raycast()方法,用于进行射线命中检测。

综上所述,传递一个Ray对象作为Physics.Raycast()的前两个形参可以提高代码的可读性和简洁性。

返回值

返回值:

  • 类型:bool
  • 描述:如果射线与碰撞体相交,返回 true,否则返回 false

如果Physics.Raycast()返回true,表示射线命中了一个碰撞体,你可以通过hitInfo变量来访问有关碰撞的信息,如:

  • hitInfo.point:碰撞点在世界空间中的位置。
  • hitInfo.normal:碰撞点处的碰撞体法线方向。
  • hitInfo.collider:被命中的碰撞体的引用。
  • 等等。

示例用法:

Ray ray = new Ray(rayOrigin, rayDirection);
if (Physics.Raycast(ray, out hitInfo, maxDistance)) {
    Debug.Log("Raycast hit at: " + hitInfo.point);
    Debug.Log("Hit object: " + hitInfo.collider.gameObject.name);
}

这个示例在rayOrigin处发射一条射线,如果射线命中了某个碰撞体,它将输出碰撞点和被命中对象的名称。

请注意,射线命中是基于物理模拟的,因此需要在物理场景中才会生效。同时,射线检测是一种较为简单的碰撞检测方法,适用于许多场景,但在某些情况下可能需要更复杂的碰撞检测方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/915059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows如何安装Git

一、简介 Git 是一个开源的分布式版本控制系统,是目前世界上最先进、最流行的版本控制系统。可以快速高效地处理从很小到非常大的项目版本管理。特点:项目越大越复杂,协同开发者越多,越能体现出 Git 的高性能和高可用性。 二、…

31、springboot 配置HTTP服务端口及如何通过WebServer实例动态获取项目中的HTTP端口

配置HTTP服务端口及如何通过WebServer实例动态获取项目中的HTTP端口 ★ 设置HTTP服务端口: - server.port或者SERVER_PORT环境变量——总结来说,其实就是要配置server.port外部配置属性。▲ 同样遵守如下优先级: 这些都是外部配置源&#x…

探索Vue生命周期钩子函数:从创生到销毁

Vue这个引领前端开发潮流的框架,其优雅的响应式数据绑定和组件式开发方式,使得它备受瞩目。然而,Vue的魅力绝不仅限于此,它还赋予开发者一组神奇的生命周期钩子函数,能够在组件的各个成长阶段插入自定义代码。本文将带…

css 实现四角边框样式

效果如图 此图只实现 左下与右下边角样式 右上与左上同理 /* 容器 */ .card-mini {position: relative; } /* 左下*/ .card-mini::before {content: ;position: absolute;left: 0;bottom: 0;width: 20px;height: 20px;border-bottom: 2px solid #253d64;border-left: 2px so…

赴日程序员学日语需要学多久?

现在很多国内程序员想转型做赴日IT,但是因为完全没有日语经验,又长期从事解决问题debug的工作,所以非常担心自己学不会日语。其实你的心底里可能比较担心是,投入了很多时间发现学不会文科类型的语言,自己没有学母语以外…

[保研/考研机试] KY124 二叉搜索树 浙江大学复试上机题 C++实现

题目链接&#xff1a; 二叉搜索树_牛客题霸_牛客网判断两序列是否为同一二叉搜索树序列。题目来自【牛客题霸】https://www.nowcoder.com/share/jump/437195121692722892652 描述 判断两序列是否为同一二叉搜索树序列 输入描述&#xff1a; 开始一个数n&#xff0c;(1<…

Python数据采集实战-使用BeautifulSoup框架解析HTML文档并提取所需内容(附源码和实现效果)

实现功能 使用BeautifulSoup框架解析HTML文档并提取所需内容的例子&#xff1a;假设我们要从以下HTML文档中提取所有超链接的链接地址 实现代码 from bs4 import BeautifulSoup import requests# 发送请求并获取HTML文档 url "https://www.baidu.com" response r…

c(Bua-Cpa-Thi-Val-Asn-Cys)-Pro-d-Arg-NEt2 acetate,1647120-04-4,试剂特点介绍

英文名&#xff1a;c(Bua-Cpa-Thi-Val-Asn-Cys)-Pro-d-Arg-NEt2 acetate CAS&#xff1a;1647120-04-4 1.Molecular formula&#xff1a;C44H64ClN11O10S2 2.Molecular weight&#xff1a;1006.63 3.Packaging specification&#xff1a;1g、5g、10g, flexible packaging, inc…

宠物小程序开发

在当今社会&#xff0c;宠物已成为许多人生活中不可或缺的一部分。宠物市场的持续增长为创业者提供了巨大的商机。然而&#xff0c;作为一个创业者&#xff0c;要在竞争激烈的宠物市场中脱颖而出并不容易。因此&#xff0c;开发一个专属于自己的宠物小程序成为了解决这一难题的…

Linux下的Shell编程——Shell概述和入门(一)

前言&#xff1a; Shell还是一个功能相当强大的编程语言&#xff0c;易编写、易调试、灵活性强。为了方便后续的学习&#xff0c;我们需要学习在Linux系统下的Shell编程 目录 一、Shell概述 1.Linux 提供的 Shell 解析器有 2. 默认的解析器是 bash 二、Shell 脚本入门 1.脚…

php+echarts实现数据可视化实例3

效果 全部代码 <?php include(includes/session.inc); include(includes/SQL_CommonFunctions.inc); ?> <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" …

OpenGL —— 2.2、Shader之间数据传输、向Shder传输数据

Shader OpenGL着色器&#xff08;shader&#xff09;是一种用于编写图形渲染代码的编程语言。它们在图形处理单元&#xff08;GPU&#xff09;上运行&#xff0c;用于控制渲染管线的不同阶段。 在OpenGL中&#xff0c;有两种主要类型的着色器&#xff1a;顶点着色器和片段着色器…

Linux 压缩解压(归档管理):tar命令

计算机中的数据经常需要备份&#xff0c;tar是Unix/Linux中最常用的备份工具&#xff0c;此命令可以把一系列文件归档到一个大文件中&#xff0c;也可以把档案文件解开以恢复数据。 tar使用格式 tar [参数] 打包文件名 文件 tar命令很特殊&#xff0c;其参数前面可以使用“-”&…

windows端口被占用——使用taskkill干掉不听话的进程

8080端口被占用为例 1. win R 输入 cmd 回车 进入命令行界面 2. 查看端口占用情况 netstat -aon|findstr 8080 查到8080被24308 进程占用 3. 杀手父进程 使用taskkill 干掉不听话的进程 taskkill /f /t /pid 24308 C:\Users\84869>taskkill /?TASKKILL [/S system…

用户端Web自动化测试-L2

目录&#xff1a; 高级定位-css高级定位-xpath显式等待高级使用高级控件交互方法网页 frame 与多窗口处理文件上传&#xff0c;弹框处理自动化关键数据记录电子商务产品实战 1.高级定位-css css 选择器概念 css 选择器有自己的语法规则和表达式css 定位通常分为绝对定位和相…

k8s-dashboard使用指导手册

一、访问 dashboard http://172.66.209.101:32001 二、选择 Namespace 如下图&#xff1a; 1 在①搜索框中输入 spms 2 在②选择 spms-cloud 三、查找 pod 1 打开 pod 列表 2 打开过滤窗口 3 搜索 pod 在打开的搜索框中输入 pod的关键字&#xff0c;支持模糊搜索 如搜索…

春秋云镜 CVE-2019-16692

春秋云镜 CVE-2019-16692 phpIPAM 1.4 - SQL Injection 靶标介绍 phpIPAM 1.4后台存在SQL Injection。 启动场景 漏洞利用 后台SQL注入&#xff0c;admin/admin888登陆成功。 exp POST /app/admin/routing/edit-bgp-mapping-search.php HTTP/1.1 Host: xxx.com Content-Le…

如何实现24/7客户服务自动化?建设智能客服知识库

客户自助服务是指用户通过企业或者第三方建立的网络平台或者终端&#xff0c;实现相关的自定义处理。实现客户服务自动化&#xff0c;对提高客户满意度、维持客户关系至关重要。客户服务自动化可以帮助企业以更快的速度和更高的效率来满足客户的售后服务要求&#xff0c;以进一…

ES搭建集群

一、创建 elasticsearch-cluster 文件夹 创建 elasticsearch-7.8.0-cluster 文件夹&#xff0c;在内部复制三个 elasticsearch 服务。 然后每个文件目录中每个节点的 config/elasticsearch.yml 配置文件 node-1001 节点 #节点 1 的配置信息&#xff1a; #集群名称&#xff0…

【NumPy系列】基本操作 - 一

知识目录 前言一、NumPy介绍1.1 导入NumPy库1.2 查看NumPy版本1.3 读取图片返回NumPy数组 二、创建NumPy数组的十二种方式2.1 array 和 full2.2 zeros 和 ones2.3 随机数数组2.4 服从正态分布的数组2.5 arrange 和 eye、linspace 三、ndarray属性四、ndarray基本操作4.1 索引4.…