当前位置: 首页 > news >正文

unity3d————范围检测

 

目录

知识点一:什么是范围检测

知识点二:如何进行范围检测

问题:

Physics.queriesHitTriggers   怎么查看是不是true?

QueryTriggerInteraction.UseGlobal 参数意味着是否检测触发器将依据全局设置 Physics.queriesHitTriggers 来决定 能不能通俗易懂讲解?

1. 球形范围检测(Sphere)

2. 非分配球形范围检测(Sphere NonAlloc)

3. 胶囊形范围检测(Capsule)

4. 非分配胶囊形范围检测(Capsule NonAlloc)

代码补全


知识点一:什么是范围检测

范围检测是一种在游戏开发中常用的技术,用于判断某个特定区域内是否存在游戏对象。这种检测通常是瞬时的,用于实现如技能伤害、效果施加等不需要物理碰撞响应的交互。

  • 应用场景

    • 玩家释放技能,如地刺或火球,需要判断技能范围内是否有敌人。
    • 玩家使用近战攻击,需要判断周围一定范围内是否有可攻击的目标。
    • 游戏中的区域触发事件,如进入特定区域触发剧情或机关。
  • 特点

    • 范围检测不涉及物理碰撞的响应,如弹力或摩擦力。
    • 范围检测可以是瞬时的,也可以是持续的(如每帧检测)。

知识点二:如何进行范围检测

  • 必备条件

    • 想要被范围检测到的对象必须具备碰撞器(Collider),因为范围检测是基于碰撞器的形状和位置进行的。
  • 注意点

    • 范围检测API只在执行该代码时进行一次检测,它是瞬时的。
    • 范围检测API并不会真正产生一个碰撞器,它只是进行碰撞判断计算。
  • 范围检测API

    • 盒状范围检测(OverlapBox)
      • 参数
        • 参数一:立方体中心点(Vector3)
        • 参数二:立方体三边大小(Vector3)
        • 参数三:立方体角度(Quaternion)
        • 参数四:检测指定层级(LayerMask)
        • 参数五:是否忽略触发器(QueryTriggerInteraction)
      • 返回值:在该范围内的碰撞器数组(Collider[])
  • 其他范围检测API

    • 球状范围检测(OverlapSphere)
      • 参数一:球体中心点
      • 参数二:球体半径
      • 参数三:检测指定层级
      • 参数四:是否忽略触发器
      • 返回值:在该范围内的碰撞器数组
    • 胶囊状范围检测(OverlapCapsule)
      • 参数一:胶囊的中心点
      • 参数二:胶囊的半径
      • 参数三:胶囊的高度
      • 参数四:胶囊的角度
      • 参数五:检测指定层级
      • 参数六:是否忽略触发器
      • 返回值:在该范围内的碰撞器数组
  • 层级检测

    • 通过 LayerMask.NameToLayer 方法可以通过层级名称获取层级编号。
    • 使用位运算(左移)构建二进制数来表示想要检测的层级。
    • 层级编号是0~31,对应一个int数的32位。
  • 示例代码

using UnityEngine;public class RangeDetectionScript : MonoBehaviour
{void Update(){// 盒状范围检测示例Vector3 center = new Vector3(5, 0, 0); // 中心点Vector3 halfExtents = new Vector3(1, 1, 1); // 半大小Quaternion direction = Quaternion.identity; // 角度LayerMask layerMask = (1 << LayerMask.NameToLayer("Enemy")); // 只检测"Enemy"层Collider[] hits = Physics.OverlapBox(center, halfExtents, direction, layerMask);foreach (var hit in hits){Debug.Log("检测到对象:" + hit.gameObject.name);}}
}

 

int uiLayer = LayerMask.NameToLayer("UI");
int defaultLayer = LayerMask.NameToLayer("Default");
Collider[] colliders = Physics.OverlapBox(Vector3.zero, Vector3.one, Quaternion.AngleAxis(45, Vector3.up),(1 << uiLayer) | (1 << defaultLayer), QueryTriggerInteraction.UseGlobal);for (int i = 0; i < colliders.Length; i++)
{Debug.Log(colliders[i].gameObject.name);
}// 使用Physics.OverlapBoxNonAlloc进行范围检测,传入一个数组进行存储
int count = Physics.OverlapBoxNonAlloc(Vector3.zero, Vector3.one, colliders, Quaternion.AngleAxis(45, Vector3.up),(1 << uiLayer) | (1 << defaultLayer), QueryTriggerInteraction.UseGlobal);
if (count > 0)
{Debug.Log("检测到 " + count + " 个碰撞器");
}
问题:
Physics.queriesHitTriggers   怎么查看是不是true?
  1. 通过 Unity 编辑器界面检查

    • 打开 Unity 编辑器。
    • 转到 "Edit" > "Project Settings" > "Physics"(在 Unity 2020 及以后的版本中,这个选项可能在 "Edit" > "Settings" > "Project" > "Physics" 中)。
    • 查看 "Queries Hit Triggers" 选项。如果这个选项被勾选,那么 Physics.queriesHitTriggers 的值就是 true;如果没有勾选,那么它的值就是 false 。

QueryTriggerInteraction.UseGlobal 参数意味着是否检测触发器将依据全局设置 Physics.queriesHitTriggers 来决定 能不能通俗易懂讲解?

这里的“全局老大”指的是Unity的一个全局设置,名字叫做 Physics.queriesHitTriggers。这个设置决定了在物理查询中是否考虑触发器。

  • 如果 Physics.queriesHitTriggers 设置为 true(开启状态),那么使用 QueryTriggerInteraction.UseGlobal 时,物理查询(比如 Physics.OverlapBox)就会检测触发器。
  • 如果 Physics.queriesHitTriggers 设置为 false(关闭状态),那么即使使用了 QueryTriggerInteraction.UseGlobal,物理查询也不会检测触发器。

简单来说,QueryTriggerInteraction.UseGlobal 就是让物理查询是否检测触发器,取决于Unity编辑器中的那个全局设置。如果全局设置允许检测触发器,它就检测;如果全局设置不允许,它就不检测。这样,你可以通过修改全局设置来统一控制所有物理查询是否检测触发器,而不需要在每个物理查询中单独设置。

1. 球形范围检测(Sphere)

  • 用途:用于检测指定球形区域内的对象。
  • 参数
    • 参数一:球体中心点(Vector3)。
    • 参数二:球体半径(float)。
    • 参数三:检测指定层级(LayerMask)。如果不填,则检测所有层。
    • 参数四:是否忽略触发器(QueryTriggerInteraction)。UseGlobal 使用全局设置,Collide 检测触发器,Ignore 忽略触发器。
  • 返回值:在该球形范围内的碰撞器数组(Collider[])。

2. 非分配球形范围检测(Sphere NonAlloc)

  • 用途:与 OverlapSphere 类似,但使用预先分配的数组来存储结果,提高性能。
  • 参数
    • 参数一:球体中心点(Vector3)。
    • 参数二:球体半径(float)。
    • 参数三:用于存储结果的碰撞器数组(Collider[])。
  • 返回值:碰撞到的碰撞器数量(int)。

3. 胶囊形范围检测(Capsule)

  • 用途:用于检测指定胶囊形区域内的对象。
  • 参数
    • 参数一:胶囊的一个中心点(Vector3)。
    • 参数二:胶囊的另一个中心点(Vector3)。
    • 参数三:胶囊的半径(float)。
    • 参数四:检测指定层级(LayerMask)。如果不填,则检测所有层。
    • 参数五:是否忽略触发器(QueryTriggerInteraction)。UseGlobal 使用全局设置,Collide 检测触发器,Ignore 忽略触发器。
  • 返回值:在该胶囊形范围内的碰撞器数组(Collider[])。

4. 非分配胶囊形范围检测(Capsule NonAlloc)

  • 用途:与 OverlapCapsule 类似,但使用预先分配的数组来存储结果,提高性能。
  • 参数
    • 参数一:胶囊的一个中心点(Vector3)。
    • 参数二:胶囊的另一个中心点(Vector3)。
    • 参数三:胶囊的半径(float)。
    • 参数四:用于存储结果的碰撞器数组(Collider[])。
  • 返回值:碰撞到的碰撞器数量(int)。

代码补全

using UnityEngine;public class RangeDetectionScript : MonoBehaviour
{void Start(){// 球形范围检测int defaultLayer = LayerMask.NameToLayer("Default");Collider[] colliders = Physics.OverlapSphere(Vector3.zero, 5, 1 << defaultLayer, QueryTriggerInteraction.UseGlobal);foreach (var collider in colliders){Debug.Log("球形检测到对象:" + collider.gameObject.name);}// 非分配球形范围检测Collider[] sphereBuffer = new Collider[100]; // 假设最多检测100个int sphereCount = Physics.OverlapSphereNonAlloc(Vector3.zero, 5, sphereBuffer, 1 << defaultLayer, QueryTriggerInteraction.UseGlobal);for (int i = 0; i < sphereCount; i++){Debug.Log("非分配球形检测到对象:" + sphereBuffer[i].gameObject.name);}// 胶囊形范围检测int uiLayer = LayerMask.NameToLayer("UI");colliders = Physics.OverlapCapsule(Vector3.zero, Vector3.up, 1, 1 << uiLayer, QueryTriggerInteraction.UseGlobal);foreach (var collider in colliders){Debug.Log("胶囊形检测到对象:" + collider.gameObject.name);}// 非分配胶囊形范围检测Collider[] capsuleBuffer = new Collider[100]; // 假设最多检测100个int capsuleCount = Physics.OverlapCapsuleNonAlloc(Vector3.zero, Vector3.up, 1, capsuleBuffer, 1 << uiLayer, QueryTriggerInteraction.UseGlobal);for (int i = 0; i < capsuleCount; i++){Debug.Log("非分配胶囊形检测到对象:" + capsuleBuffer[i].gameObject.name);}}
}

 

 

相关文章:

unity3d————范围检测

目录 知识点一&#xff1a;什么是范围检测 知识点二&#xff1a;如何进行范围检测 问题&#xff1a; Physics.queriesHitTriggers 怎么查看是不是true&#xff1f; QueryTriggerInteraction.UseGlobal 参数意味着是否检测触发器将依据全局设置 Physics.queriesHitTrigge…...

修改this.$confirm的按钮位置、图标、文字及标题

在Vue.js项目中&#xff0c;this.$confirm 通常是基于某些UI库&#xff08;如Element UI或Ant Design Vue&#xff09;的对话框确认方法。 以下是基于Element UI的this.$confirm的用法示例。 在此之前&#xff0c;你的项目要已经安装了Element UI&#xff0c;如果没安装话就打…...

SQL MID() 函数详解

SQL MID() 函数详解 SQL 中的 MID() 函数是一个非常有用的字符串处理工具&#xff0c;它允许用户从字符串中提取特定位置的子字符串。这个函数在数据库查询和报告中特别有用&#xff0c;尤其是在需要从较长的文本字段中提取特定信息时。本文将详细介绍 MID() 函数的用法、参数…...

【蓝桥杯备赛】123(前缀和的复杂应用)

5. 前缀和的复杂应用 5.1. 123&#xff08;4 星&#xff09; 5.1.1. 题目解析 这道题仍然是求一段区间的和&#xff0c;很容易能够想到前缀和找规律&#xff1a; 1------------------1 号块 1 2----------------2 号块 1 2 3--------------3 号块 1 2 3 4------------4 号…...

MINES

MINES (m)6A (I)dentification Using (N)anopor(E) (S)equencing Tombo(v1.4) 命令在 MINES 之前执行&#xff1a; &#xff08;仅在 fast5 文件中尚未包含 fastq 时需要&#xff09; tombo preprocess annotate_raw_with_fastqs --fast5-basedir /fast5_dir/ --fastq-file…...

H.265流媒体播放器EasyPlayer.js H5流媒体播放器关于如何查看手机端的日志信息并保存下来

现今流媒体播放器的发展趋势将更加多元化和个性化。人工智能的应用将深入内容创作、用户体验优化等多个方面&#xff0c;带来前所未有的个性化体验。 EasyPlayer.js H.265流媒体播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#…...

uni-app快速入门(十一)--常用JS API(上)

在前面学习了uni-app的布局、组件、路由等知识点以后&#xff0c;还要掌握uni-app的JS API ,也可以理解为基于uni-app的java script。本节介绍uni-app的request请求、文件上传、数据缓存、获取位置、获取系统信息、获取手机的网络状态、拨打电话API。 一、request请求 使用uni…...

Flink任务提交到yarn上slot数量为0的问题

现象&#xff1a;Flink提交到yarn上slot数量为0的问题 解决方法&#xff1a; 参考论坛上的方案&#xff0c;修改flink-conf.yaml文件都不管用 最终解决方法&#xff1a; $FLINK_HOME/lib 路径下有2个非.jar结尾的文件&#xff0c;把这几个文件移走之后&#xff0c;再启就可…...

vue3怎么根据字符串获取组件实例

例子&#xff1a; 我在使用vue2开发的时候&#xff0c;定义了一个方法 handler(strRef){ this.$refs[strRef].innerText hello world }&#xff0c; 我在点击某个按钮的时候&#xff0c;调用了方法handler&#xff0c;传递了一个参数是字符串 condition&#xff0c;然后方法…...

ISUP协议视频平台EasyCVR私有化视频平台新能源汽车充电停车管理方案的创新与实践

在环保意识提升和能源转型的大背景下&#xff0c;新能源汽车作为低碳出行的选择&#xff0c;正在全球迅速推广。但这种快速增长也引发了充电基础设施短缺和停车秩序混乱等挑战&#xff0c;特别是在城市中心和人口密集的居住区&#xff0c;这些问题更加明显。因此&#xff0c;开…...

智领未来: 宏集物联网HMI驱动食品与包装行业迈向智能化新高度

行业现状与挑战 食品与包装行业对设备的自动化、智能化水平要求日益提高&#xff0c;特别是瓶装和灌装生产线需要实现高速、高效的生产。此外&#xff0c;该行业还需遵循严格的卫生标准和安全规范&#xff0c;以保证产品质量符合消费者需求。在提高生产效率的同时&#xff0c;…...

redis-击穿、穿透、雪崩

击穿、穿透、雪崩经常听人说吧&#xff1f; 那他到底是啥呢&#xff1f;无非就是在有缓存层的情况下&#xff0c;对各种绕过缓存层从而直接落到了DB上的情况进行的分类。 概念性的东西大概如下&#xff0c;我是记不住&#xff0c;后期具体使用与规避这些问题才是大事&#xff…...

【Redis】服务器异常重启,导致redis启动失败

redis启动失败日志提示信息&#xff1a;Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename> 错误日志示例图&#xff08;看最后一句&#xff09; 错误原因解析 这个错误通常是由于Redis的…...

Springboot+Vue的项目搭建(三)

一、拦截器 拦截器&#xff08;Interceptor&#xff09;是一种重要的软件设计模式&#xff0c;它在程序执行过程中能够拦截或截取特定的操作或事件&#xff0c;并在操作发生之前、之后或替代操作本身进行自定义的处理。以下是对拦截器知识点的详细归纳&#xff1a; 拦截器的定…...

【Word】一键批量引用论文上标——将正文字体改为上标格式

【Word】一键批量引用论文上标——将正文字体改为上标格式 写在最前面Word一键批量引用论文上标技巧分享核心思路&#xff1a;Word 替换功能 通配符步骤详解1. 打开 Word 替换功能2. 输入通配符模式3. 设置替换格式为上标4. 批量替换 实际效果展示技巧扩展 &#x1f308;你好呀…...

DAY1 网络编程(TCP客户端服务器)

作业&#xff1a; TCP客户端服务器。 server服务器代码&#xff1a; #include <myhead.h> #define IP "192.168.110.52" #define PORT 8886 #define BACKLOG 20 int main(int argc, const char *argv[]) {int oldfdsocket(AF_INET,SOCK_STREAM,0);//IPV4通信…...

如何在Ubuntu当中利用CloudCompare软件进行点云配准拼接?

1.首先需要安装相应的cloudcompare软件&#xff0c;以下有两种方式&#xff1a;第一种直接在ubuntu的软件商店里搜索CloudCompare软件进行install&#xff0c;我这里已经安装完毕。 方式二&#xff1a;可以直接原码安装&#xff1a; github地址&#xff1a; https://github.co…...

AWTK 最新动态:支持鸿蒙系统(HarmonyOS Next)

HarmonyOS是全球第三大移动操作系统&#xff0c;有巨大的市场潜力&#xff0c;在国产替代的背景下&#xff0c;机会多多&#xff0c;AWTK支持HarmonyOS&#xff0c;让AWTK开发者也能享受HarmonyOS生态的红利。 AWTK全称为Toolkit AnyWhere&#xff0c;是ZLG倾心打造的一套基于C…...

vue数据变化但页面不变

记录一下vue中数据变了 但是页面没有变化的几种情况和解决办法 情况一&#xff1a;vue无法检测实例不存在于data中的变量 原因&#xff1a;由于 Vue 会在初始化实例时对data中的数据执行getter/setter转化&#xff0c;所以变量必须在data对象上存在才能让Vue将它转化成响应式…...

Leetcode128. 最长连续序列(HOT100)

链接 第一次错误提交&#xff1a; class Solution { public:int longestConsecutive(vector<int>& nums) {int n nums.size();int res 0;sort(nums.begin(),nums.end());//第一次错误写作&#xff1a;sort(nums,numsn);nums是std::vector<int>类型&#xf…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...