Unity常用射线检测接口用法及优缺点

在Unity中,射线检测是一种非常常见的技术,用于检测物体之间的碰撞、获取物体之间的距离等。今天我们来说一说射线检测的方法以及它们的优缺点:

Physics.Raycast:

using UnityEngine;public class RaycastExample : MonoBehaviour
{void Update(){if (Input.GetMouseButtonDown(0)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hitInfo;if (Physics.Raycast(ray, out hitInfo)){Debug.Log("Hit object: " + hitInfo.collider.name);}}}
}

优点:

简单易用,适用于大多数场景。
可以检测单个射线与碰撞器之间的相交。

缺点:

只能检测单个射线,无法检测射线与多个碰撞器之间的相交。
需要额外处理射线方向和距离。

Physics.RaycastAll:

using UnityEngine;public class RaycastAllExample : MonoBehaviour
{void Update(){if (Input.GetMouseButtonDown(0)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit[] hitInfos = Physics.RaycastAll(ray);foreach (RaycastHit hitInfo in hitInfos){Debug.Log("Hit object: " + hitInfo.collider.name);}}}
}

优点:

可以检测射线与多个碰撞器之间的相交。
返回所有相交的碰撞器,提供更多信息。

缺点:

需要额外处理返回的碰撞信息,包括距离、碰撞点等。

Physics.RaycastNonAlloc:

using UnityEngine;public class RaycastNonAllocExample : MonoBehaviour
{RaycastHit[] hits = new RaycastHit[10]; // Pre-allocated arrayvoid Update(){if (Input.GetMouseButtonDown(0)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);int hitCount = Physics.RaycastNonAlloc(ray, hits);for (int i = 0; i < hitCount; i++){Debug.Log("Hit object: " + hits[i].collider.name);}}}
}

优点:

与Physics.Raycast类似,但可以自定义返回结果数组,提高性能。

缺点:

需要手动管理返回结果数组,稍显复杂。

Physics.Linecast:

using UnityEngine;public class LinecastExample : MonoBehaviour
{void Update(){if (Input.GetMouseButtonDown(0)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hitInfo;if (Physics.Linecast(ray.origin, ray.origin + ray.direction * 100, out hitInfo)){Debug.Log("Hit object: " + hitInfo.collider.name);}}}
}

优点:

用于检测两个点之间的相交,比较适用于特定场景。

缺点:

只能检测直线路径上的相交,不能检测曲线路径。
需要提供起点和终点坐标。

Physics.BoxCast、Physics.SphereCast:

using UnityEngine;public class BoxCastExample : MonoBehaviour
{void Update(){if (Input.GetMouseButtonDown(0)){Vector3 origin = transform.position;Vector3 halfExtents = new Vector3(1, 1, 1);Vector3 direction = transform.forward;RaycastHit hitInfo;if (Physics.BoxCast(origin, halfExtents, direction, out hitInfo)){Debug.Log("Hit object: " + hitInfo.collider.name);}}}
}
using UnityEngine;public class SphereCastExample : MonoBehaviour
{public float radius = 0.5f;public float distance = 10f;public LayerMask layerMask;void Update(){if (Input.GetMouseButtonDown(0)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hitInfo;if (Physics.SphereCast(ray, radius, out hitInfo, distance, layerMask)){Debug.Log("Hit object: " + hitInfo.collider.name);}}}
}

优点:

可以模拟物体的体积进行碰撞检测。

缺点:

比射线检测更消耗性能,适用于需要物体体积的检测场景。

选择适当的射线检测方法取决于你的具体需求和场景。在性能和功能之间进行权衡,根据实际情况选择最合适的方法。

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

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

相关文章

stm32开发之threadx之modulex模块文件的生成脚本项目

前言 为了保证在window上运行&#xff0c;且体积小的问题&#xff0c;所以采用c语言编写生成脚本,将相关路径由json文件进行配置,使用了一个cjson库进行解析项目构建使用的是cmake 项目代码 CMakeLists文件 cmake_minimum_required(VERSION 3.27) project(txm_bat_script C…

Day13-Java进阶-IO字节流及其练习题

1. IO流介绍 2. IO 流体系结构 字节流读取纯文本文件会出现乱码问题 2.1 FileOutputStream 字节输出流 package com.itheima.stream.output;import java.io.FileOutputStream; import java.io.IOException;public class FileOutputStreamDemo3 {/*IO流的异常处理方式: jdk7版本…

socket编程——tcp

在我这篇博客&#xff1a;网络——socket编程中介绍了关于socket编程的一些必要的知识&#xff0c;以及介绍了使用套接字在udp协议下如何通信&#xff0c;这篇博客中&#xff0c;我将会介绍如何使用套接字以及tcp协议进行网络通信。 1. 前置准备 在进行编写代码之前&#xff…

dell r730 ESXi重启后找不到raid盘(待续)

dell r730 ESXi重启后找不到raid盘&#xff0c;报错ESXi error failed to connect to database &#xff0c;怀疑是不小心硬关机导致的问题..... 在这之前的操作是在ESXi 的虚拟机FreeBSD里尝试安装nvidia驱动和anaconda&#xff0c;结果关机重启后&#xff0c;找不到虚拟机…

Python小程序 - 文件类型统计

文件以后缀名区分类型&#xff1a;统计文件个数&#xff1b;不同类型文件个数 1. 遍历文件目录&#xff0c;判断当前对像类型&#xff08;文件夹、文件&#xff09;后统计文件类型数量 2. 通过DIR 或 LS 命令遍历当前目录&#xff0c;输出至文件&#xff0c;对文件进行解析…

C语言学习/复习30--结构体的声明/初始化/typedef改名/内存对齐大小计算

一、自定义数据类型 二、结构体 1.结构体的定义&#xff08;与数组相对比&#xff09; 2.结构体全局/局部变量的定义 3.typedef对结构体改名 4.匿名结构体类型的声明 注意事项1&#xff1a; 匿名后必须立即创建结构体变量 、 5.结构体与链表节点定义 注意事项1&…

arduino rc522

读取卡号 #include <SPI.h> #include <MFRC522.h>#define RST_PIN 9 // Reset pin of the module #define SS_PIN 10 // Slave Select pin of the moduleMFRC522 rfid(SS_PIN, RST_PIN); // Create MFRC522 instancevoid setup() {Serial…

【VLP(Visual-Linguistic Pretraining)模型相关基本知识】

VLP&#xff08;Visual-Linguistic Pretraining&#xff09;模型相关基本知识 VLP&#xff08;Visual-Linguistic Pretraining&#xff09;模型是一种用于视觉与语言联合训练的模型。它旨在通过同时学习视觉和语言任务&#xff0c;从大规模的视觉和语言数据中提取丰富的视觉和…

Datawhale ChatGPT基础科普

根据课程GitHub - datawhalechina/hugging-llm: HuggingLLM, Hugging Future. 摘写自己不懂得一些地方&#xff0c;具体可以再到以上项目地址 LM&#xff1a;这是ChatGPT的基石的基石。 Transformer&#xff1a;这是ChatGPT的基石&#xff0c;准确来说它的一部分是基石。 G…

nodejs工具模块学习

util 是一个Node.js 核心模块&#xff0c;提供常用函数的集合&#xff1b; util.inspect(object,[showHidden],[depth],[colors]) 是一个将任意对象转换 为字符串的方法&#xff0c;通常用于调试和错误输出&#xff1b; 如果只有一个参数 object&#xff0c;是要转换的对象&…

英伟达AI系列免费公开课

英伟达公开课官网地址 Augment your LLM Using Retrieval Augmented Generation Building RAG Agents with LLMs langchain的workflow: ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c90cb157c9c84bb5b3da380ec56f5c2a.png Generative AI Explained

函数的使用

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 前面已经介绍了函数的创建以及调用&#xff0c;下面就通过范例学习函数的使用 创建一个函数&#xff0c;如果是偶数则计算其平方&#xff0c;如果是奇数则计算其平方根 分…

如何在 Flutter 中制作多种颜色的 TextField

TextField widget 本身并不施加任何样式。相反&#xff0c;它会要求 TextEditingController 生成一个样式化的 TextSpan 对象&#xff0c;即一段带有样式的文本。 TextField 将其样式传递给 TextEditingController &#xff0c;默认实现只是将其放入 TextSpan 对象中&#xff0…

abide数据集时间序列获取

1.http://preprocessed-connectomes-project.org/abide/ 2. 3.windows批量下载 &#xff08;1&#xff09;创建links.txt&#xff0c;写入链接&#xff0c;例如 https://s3.amazonaws.com/fcp-indi/data/Projects/ABIDE_Initiative/Outputs/dparsf/filt_global/rois_cc400/K…

Java拓扑排序知识点(含面试大厂题和源码)

在技术面试中&#xff0c;大厂可能会要求候选人实现或优化一些与图相关的算法&#xff0c;比如深度优先搜索&#xff08;DFS&#xff09;、广度优先搜索&#xff08;BFS&#xff09;和拓扑排序等。以下是三道与这些算法相关的面试题目&#xff0c;以及它们的Java源码示例。 1.…

Hdu3118 Arbiter【二进制枚举建二分图】

Arbiter 题意 给定 n n n 个点和 m m m 条边&#xff0c;要求删除最少数量的边&#xff0c;使图中没有奇环 n ≤ 15 , m ≤ 300 n \leq 15,m \leq 300 n≤15,m≤300 思路 没有奇环的图是二分图 我们可以直接从定义入手&#xff0c;用二进制枚举二分图的两个颜色的点&#…

(十六)call、apply、bind介绍、区别和实现

函数中的this指向&#xff1a; 函数中的this指向是在函数被调用的时候确定的&#xff0c;也就是执行上下文被创建时确定的。在一个执行上下文中&#xff0c;this由调用者提供&#xff0c;由调用函数的方式来决定。 类数组对象arguments&#xff1a; arguments只在函数&#…

谷歌收录工具有什么好用的?

如果是想促进谷歌的收录&#xff0c;其实能用的手段无非就两个&#xff0c;谷歌GSC以及爬虫池 谷歌gsc就不用说了&#xff0c;作为谷歌官方提供的工具&#xff0c;他能提供最准确的数据&#xff0c;并且可以提交每天更新的链接&#xff0c;进而促进收录&#xff0c;只要你的页面…

day18 java ​​​​​​​集合Collection的List和Set

Collection分成List和Set|------Collection|-------List : 存储的元素是有序的并且可以重复|--------ArrayList|--------LinkedList|--------Vector|-------Set : 存储的元素是无序的并且不可以重复|--------HashSet|--------LinkedHashSet|--------TreeSet List接口 List常…

java面向对象.day28(接口的定义与实现)

Java接口&#xff08;Interface&#xff09;是Java编程语言中的一个重要概念&#xff0c;它定义了一个类应该具备的方法&#xff0c;但不提供具体的实现。接口可以被看作是一种特殊的抽象类&#xff0c;其中所有的方法都是抽象的。一个类可以实现&#xff08;implements&#x…