[Unity]碰撞器的接触捕获层详解

目录

  • 前言
  • ※关闭效果器(Effector)的遮罩
  • 接触捕获层的官方描述
  • 官方描述的翻译和注解
    • 接触捕获层作用简介
    • 接触(Contact)和捕获(Capture)
    • 配置接触捕获层的作用
    • ※接触捕获层对碰撞响应的影响
    • 需要接触捕获的物理查询
    • 需要接触捕获的物理回调
    • 注意
    • 运行时(Runtime)修改
    • 接触的相互性
    • 总结
  • 相关问题汇总
    • 1.怎样完全无视A和B的任何接触和碰撞?
    • 2.怎样允许A和B的接触,但禁用A和B之间的物理碰撞?
    • 3.为什么全局碰撞矩阵/包含层/排除层失效了?

前言

本文详细介绍了Unity引擎Collider2D组件的Layer Overrides属性栏的属性Contact Capture Layers,即接触捕获层
如果你在项目中遇到了问题,但不确定是否是接触捕获层的设置错误导致的,请跳转至相关问题汇总查询。

本文的所有解释基于Unity 2023.2官方文档,具有时效性,若Unity版本更迭导致解释失效,欢迎留言指正!

※关闭效果器(Effector)的遮罩

如果你希望在Unity工程中对本文内容进行验证,并且实验对象的碰撞器(Collider)勾选了由效果器使用,请取消勾选效果器的使用碰撞器遮罩选项,否则效果器的遮罩会覆盖碰撞器的Layer Overriders属性,导致实验结果与预期不符。

接触捕获层的官方描述

Unity Decumentation - Collider2D.contactCaptureLayers
请添加图片描述

官方描述的翻译和注解

接触捕获层作用简介

接触捕获层:与当前Collider2D接触的层,如果在Contact Capture Layers中被勾选,那么接触将被捕获

接触(Contact)和捕获(Capture)

接触由物理系统产生,用于计算碰撞响应等行为。
接触是自动生成的,只需要捕获接触就可以对其执行物理查询或生成物理回调

物理查询】IsTouching、IsTouchingLayers/GetContacts等用于检测和查询物理接触情况的方法。
注意,BoxCast、RayCast等方法和此处的物理查询不同,这些方法通过数学计算来预测和检测物体是否会与其他物体相交,因此不需要接触捕获
物理回调】OnCollisionEnter、OnCollisionExit、OnTriggerEnter、OnTriggerExit等特定的物理事件发生时被自动调用的方法。

通常,所有接触层都会被捕获和存储,但这会导致处理时间和内存消耗增加。
因此,只选择需要的层进行捕获,可以提高性能并降低整体内存消耗;
但是未捕获的层的接触,在物理查询中不可用,也不会产生物理回调。

接触层
由层级碰撞矩阵、Layer Overrides的包含层和排除层决定。
值得注意,不是所有接触层都会被捕获,只有被捕获的接触层才能进行物理查询、产生物理回调。

配置接触捕获层的作用

通过配置接触捕获层,可以确保只接收来自选定层的响应。

这意味着在C#脚本中,可以只关心特定层的物理事件。

※接触捕获层对碰撞响应的影响

接触的捕获不会影响碰撞响应,因为接触在捕获之前总是由物理系统处理的。

【注】如果你希望禁用两个物体的碰撞响应,或者你不希望A物体和B物体之间产生任何物理互动,在接触捕获层中取消勾选是无法实现的。因为接触捕获层只负责启用/禁用物理查询和物理回调。
正确的做法:
1.如果你希望完全无视A和B的接触:在全局碰撞矩阵中取消勾选A和B所在的Layer,或者在A或B的排除层(Exclude Layers)中取消勾选B所在的图层。
e.g.人物和人物发射的子弹
2.如果你希望A不对B产生力的效果,但是需要获取A和B的碰撞信息:允许A和B的接触(在全局碰撞矩阵中勾选A和B所在的Layer,或者在A或B的包含层(Include Layers)中勾选B所在的图层),但是在A的力发送层(Force Send Layers)取消勾选B所在的图层。同理,或者在B的力接收层(Force Receive Layers)取消勾选A所在的图层。
e.g.人物和怪物发射的子弹(无击退)

需要接触捕获的物理查询

Physics2D.IsTouching
Rigidbody2D.IsTouching
Collider2D.IsTouching
Physics2D.IsTouchingLayers
Rigidbody2D.IsTouchingLayers
Collider2D.IsTouchingLayers
Physics2D.GetContacts
Rigidbody2D.GetContacts
Collider2D.GetContacts

需要接触捕获的物理回调

OnCollisionEnter2D
OnCollisionStay2D
OnCollisionExit2D
OnTriggerEnter2D
OnTriggerStay2D
OnTriggerExit2D

【注】即常用的6个碰撞回调/触发回调

注意

此属性不控制碰撞体是否会接触,而只是控制是否捕获接触以进行查询和回调。
即使在Callback Layers中选择了所有层,也只会报告那些被捕获的层。

【注】这一点在上文(接触捕获层对碰撞响应的影响)已经详细解释

运行时(Runtime)修改

修改接触捕获层将导致所有接触信息被销毁。
仍然有效的接触将通过物理回调报告为新的接触信息。
由于此属性(接触捕获层)会破坏现有接触信息,如果需要通过物理回调跟踪接触状态,不建议在运行时更改此属性。

接触的相互性

接触是相互的,如果接触中的任何一个碰撞体禁用了对接触的捕获,那么双方都不会看到接触。

总结

当某个层的接触捕获功能关闭时,该层的接触查询将不会返回结果,也不会产生任何回调。

总的来说,接触捕获层,名副其实,只负责启用/禁用对接触的捕获,没有被捕获的接触,物理查询没有结果,也不会产生回调。接触捕获层,不负责启用/禁用接触,所以即使禁用了接触捕获,A物体仍然会被B物体所阻挡!

相关问题汇总

出现以下问题时,也许不是接触捕获层设置错误导致的,请检查其他设置。

1.怎样完全无视A和B的任何接触和碰撞?

在全局碰撞矩阵中取消勾选A和B的Layer
确保A和B的Collider都没有在包含层中取消勾选对方的Layer
如果A和B的Collider使用了Effector,取消勾选Effector的遮罩

2.怎样允许A和B的接触,但禁用A和B之间的物理碰撞?

方案一:把一方设置为Trigger
方案二:取消勾选力发送/接收层
允许接触:
在全局碰撞矩阵中勾选A和B的Layer
或者在A或B的Collider的包含层中勾选对方的Layer
禁用物理碰撞:
取消勾选一方的力发送/接收层

3.为什么全局碰撞矩阵/包含层/排除层失效了?

关闭效果器(Effector)的遮罩!!!
关闭效果器(Effector)的遮罩!!!
关闭效果器(Effector)的遮罩!!!
检查层覆盖优先级(Layer Override Priority)!!!
检查层覆盖优先级(Layer Override Priority)!!!
检查层覆盖优先级(Layer Override Priority)!!!
碰撞器中使用了由复合使用由效果器使用的尤其注意。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

再谈有关JVM中的四种引用

1.强引用 强引用就是我们平时使用最多的那种引用,就比如以下的代码 //创建一个对象 Object obj new Object();//强引用 这个例子就是创建了一个对象并建立了强引用,强引用一般就是默认支持的当内存不足的时候,JVM开始垃圾回收&#xff0c…

新手设计必读:学习五种流行弹窗基本样式

本文将给大家分享弹窗设计的 5 个关键方法是布局合理性、可视化元素、考虑目标受众、避免复杂内容、合理定时触发方式;5个弹窗设计基本样式,分别是电商应用弹窗、简约风格弹窗、红包主题弹窗、可视化按钮弹窗、多款通用 APP 弹窗。 即时设计-可实时协作…

EPLAN 去掉PDF中的红色跳转标识

EPLAN PDF图纸导出后体验跳转标识会有红色标识,如何去掉呢?下面介绍一下方法: 此为现象: EPLAN 2.9的帮助文档里提示: 在导出的 PDF 文档中,跳转后的跳转目标现在通过红色的闪烁框进行标识。可能的跳转目…

ROS2-Navigation2初体验:Gazebo“打不开”

输入ros2 launch nav2_bringup tb3_simulation_launch.py headless:False后只能打开RVIZ而无法打开Gazebo的问题,多次尝试解决后发现只是多等待一会儿即可,在此给同样学习Navigation2的朋友们提个醒 。 Getting Started — Nav2 1.0.0 documentation 1…

数据结构(4.4)——求next数组

next数组的作用:当模式串的第j个字符失配时,从模式串的第next[j]的继续往后匹配 求模式串的next数组(手算) next[1] 任何模式串都一样,第一个字符不匹配时,只能匹配下一个子串,因此,往后,next[1]都无脑写…

python的日期和时间

时间与日期 基础知识(python的时间表示方法) 时间戳 时间戳是一个用于表示特定时间点的方式,它表示自1970年1月1日00:00:00 UTC(协调世界时)以来经过的秒数。时间戳通常用于编程中,因为它提供了一种简单的方…

树结构添加分组,向上向下添加同级,添加子级

树结构添加分组&#xff0c;向上向下添加同级&#xff0c;添加子级 效果代码实现页面js 效果 代码实现 页面 <el-tree :data"treeData" :props"defaultProps" :expand-on-click-node"false":filter-node-method"filterNode" :ref&…

实战:功能强大齐全BBS论坛项目Echo简介

项目简介 Echo 是一套前后端不分离的开源社区系统&#xff0c;基于目前主流 Java Web 技术栈&#xff08;SpringBoot MyBatis MySQL Redis Kafka Elasticsearch Spring Security ...&#xff09;&#xff0c;并提供详细的开发文档和配套教程。包含帖子、评论、私信、系…

QT官方modbus_slave例子嵌入到界面

1.打开QT官方modbus_slave的例子 根据提示略微配置一下编译选项&#xff0c;就可以正常运行。 2.新将一个项目包含这个例子 这个例子非常简单&#xff0c;就是在默认的mainwindow上给个按钮&#xff0c;点击按钮调用这个例子的界面。 3.修改*.pro文件 serialport serialbus …

腾讯解禁 QQ 极速版,且看我收集的最全 QQ 各类版本

因为利益关系&#xff0c;腾讯早就限制QQ极速版的登录了&#xff0c;近日居然解除限制了&#xff0c;面对越来越臃肿的QQ&#xff0c;我给大伙准备了几十个版本的QQ&#xff0c;总有一个适合你。 QQ版本合集 给大伙们收集了QQ版本合集&#xff0c;分别有历史版本、精简版本、内…

第59期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

动手学深度学习——3.多层感知机

1.线性模型 线性模型可能出错 例如&#xff0c;线性意味着单调假设&#xff1a; 任何特征的增大都会导致模型输出的增大&#xff08;如果对应的权重为正&#xff09;&#xff0c; 或者导致模型输出的减小&#xff08;如果对应的权重为负&#xff09;。 有时这是有道理的。 例…

【Java--数据结构】队列与栈的相互成就

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 用队列实现栈 用栈实现队列 用队列实现栈 oj链接 一个队列是无法实现栈的 入栈push&#xff1a;把数据放到不为空的队列当中。 注意&#xff1a;第一次入栈时&…

手写new

手写new new是什么执行new会发生什么实现new new是什么 new 操作符是可以创建一个用户定义的对象的实例或具有构造函数的内置对象的实例 function Car (make, model, year) {this.make makethis.model modelthis.year year } Car.prototype.running function () {return …

R语言极值分析:GEV与GPD模型与MCMC的海洋观测数据极值模拟可视化研究

全文链接&#xff1a;https://tecdat.cn/?p37007 原文出处&#xff1a;拓端数据部落公众号 在海洋科学领域&#xff0c;极端天气和海洋事件如极端海浪、风暴潮和海啸等&#xff0c;对沿海社区、基础设施及生态环境构成了重大威胁。准确预测和评估这些极端事件的强度和频率&a…

Golang中读写锁的底层实现

目录 Sync.RWMutex 背景与机制 接口简单介绍 sync.RWMutex 数据结构 读锁流程 RLock RUnlock RWMutex.rUnlockSlow 写锁流程 Lock Unlock Sync.RWMutex 背景与机制 从逻辑上&#xff0c;可以把 RWMutex 理解为一把读锁加一把写锁&#xff1b; 写锁具有严格的排他性&…

Qt程序图标更改以及程序打包

Qt程序图标更改以及程序打包 1 windows1.1 cmake1.1.1 修改.exe程序图标1.1.2 修改显示页面左上角图标 1.2 qmake1.2.1 修改.exe程序图标1.2.2 修改显示页面左上角图标 2 程序打包2.1 MinGW2.2 Visual Studio 3 参考链接 1 windows 1.1 cmake 1.1.1 修改.exe程序图标 获得一个…

【Linux】进程控制的详细介绍

前言 在此之前&#xff0c;我们学过进程的概念&#xff0c;进程的状态&#xff0c;进程地址空间等一系列进程相关的问题。本章我们继续学习进程&#xff0c;我们要来学习一下进程的控制&#xff0c;关于进程等待&#xff0c;等问题。 目录 1.再次认识Fork函数1.1 fork()之后操…

搜集日志。

logstash 负责&#xff1a; 接收数据 input — 解析过滤并转换数据 filter(此插件可选) — 输出数据 output input — decode — filter — encode — output elasticsearch 查询和保存数据 Elasticsearch 去中心化集群 Data node 消耗大量 CPU、内存和 I/O 资源 分担一部分…

数据结构进阶:使用链表实现栈和队列详解与示例(C, C#, C++)

文章目录 1、 栈与队列简介栈&#xff08;Stack&#xff09;队列&#xff08;Queue&#xff09; 2、使用链表实现栈C语言实现C#语言实现C语言实现 3、使用链表实现队列C语言实现C#语言实现C语言实现 4、链表实现栈和队列的性能分析时间复杂度空间复杂度性能特点与其他实现的比较…