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

news2024/11/27 11:38:38

目录

  • 前言
  • ※关闭效果器(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.coloradmin.cn/o/1929608.html

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

相关文章

关于普通接口转AXI接口AMM Master Bridge仿真和使用

平台:vivado2023.1 应用场景,在设计的过程中,在xilinx内部的IP采用AXI接口协议。而我们外部的FIFO,BRAM等接口有时候使用的Native接口。使用AMM Master Bridge IP将普通的native接口转换为AXI接口协议。 参考文件:pg…

C++ | Leetcode C++题解之第229题多数元素II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> majorityElement(vector<int>& nums) {int n nums.size();vector<int> ans;unordered_map<int, int> cnt;for (auto & v : nums) {cnt[v];}for (auto & v : cnt…

leetcode 28.找出字符串中第一个匹配项的下标

对于Java来说直接秒呗&#xff1a; public static int strStr(String haystack, String needle) {return haystack.indexOf(needle); }

Unity UGUI Image Maskable

在Unity的UGUI系统中&#xff0c;Maskable属性用于控制UI元素是否受到父级遮罩组件的影响。以下是关于这个属性的详细说明和如何使用&#xff1a; Maskable属性 Maskable属性&#xff1a; 当你在GameObject上添加一个Image组件&#xff08;比如UI面板或按钮&#xff09;时&…

渲染100农场有哪些优势?渲染100邀请码1a12

渲染100是知名的渲染农场&#xff0c;深受广大设计师欢迎&#xff0c;比起其他农场&#xff0c;它有什么优势呢&#xff1f;我们一起来看看。 1、资源丰富 渲染100拥有强大的计算集群&#xff0c;能多线处理大规模、超复杂的场景渲染需要&#xff0c;性能卓越。2、成本低廉 渲…

【iOS】OC类与对象的本质分析

目录 前言clang常用命令对象本质探索属性的本质对象的内存大小isa 指针探究 前言 OC 代码的底层实现都是 C/C代码&#xff0c;OC 的对象都是基于 C/C 的数据结构实现的&#xff0c;实际 OC 对象的本质就是结构体&#xff0c;那到底是一个怎样的结构体呢&#xff1f; clang常用…

glibc-all-in-one+patchelf修改程序libc

主要是做堆的时候经常遇到libc小版本不对导致libcbase不对打不通的情况&#xff0c;再者&#xff0c;每个题换一个ubuntu虚拟机属实麻烦&#xff0c;所以还是回到最初也是最好用的做法&#xff1a;patch libc。 核心就是两个工具&#xff1a;glibc-all-in-one和patchlef。但是…

buuctf-web

查看后端源码 得到base64编码&#xff0c;解码得flag

pc端注册页面 密码校验规则

1.密码校验规则 格应包含大小写字母、数字和特殊符号,长度为8-20 var validateRetrievePassword (rule, value, callback) > {let reg /^(?.*[A-Za-z])(?.*\d)(?.*[~!#$%^&*()_<>?:"{},.\/\\;[\]])[A-Za-z\d~!#$%^&*()_<>?:"{},.\/\\;…

WSL-Ubuntu20.04训练环境配置

1.YOLOv8训练环境配置 训练环境配置的话就仍然以YOLOv8为例&#xff0c;来说明如何配置深度学习训练环境。这部分内容比较简单&#xff0c;主要是安装miniAnaconda以及安装torch和torchvision. 首先是miniAnaconda的安装(参考官网的教程Miniconda — Anaconda )&#xff0c;执行…

开发笔记 | 快速上手[法大大]电子合同SDK使用SpringBoot+JAVA

Springbootmavenjava 官方API文档 API - 法大大电子合同和电子签云平台 官方SDK下载 API - 法大大电子合同和电子签云平台 目录 目录 开发前准备 项目整合 功能1&#xff1a;查询文档模板列表 功能2&#xff1a;文档模板字段填充 开发前准备 1.点下方链接注册法大大测试环…

昇思25天学习打卡营第12天|munger85

基于MindSpore通过GPT实现情感分类 这个实现情感分类意思就是通过一些电影的数据最后知道他对于这个电影的评价&#xff0c;最后知道他对于这个电影的评价到底是好还是不好&#xff0c;零就是不好&#xff0c;一就是好。首先我们肯定是按安装这些依赖包了为了今天这个模型我们…

Postman、Apifox、Apipost用哪个?

Postman、Apifox、Apipost都是流行的API接口管理工具&#xff0c;它们各自具有不同的特点和优势&#xff0c;因此哪个更好用取决于具体的使用场景和需求。以下是对这三个工具的比较分析&#xff1a; 一、Postman 特点与优势&#xff1a; 支持多种请求方式&#xff1a;包括GE…

游戏分组(DFS)

游戏分组&#xff08;DFS&#xff09; 将10名参赛者根据其游戏水平评分分为实力尽量相近的两队。 深度优先搜索&#xff08;DFS&#xff09;是游戏分组中常用的一种算法思路。 DFS在解决特定类型的分组问题时&#xff0c;特别是需要遍历所有可能组合的情况&#xff0c;表现出了…

一文详解:医疗营销升级的智能解决方案

顺境是所有人的狂欢&#xff0c;逆境才是优秀者的天堂。淘金的时代过去了&#xff0c;未来是冶金的时代。 01、享受完改革开放40年的高速区间红利 企业正处于中速区间的全面竞争期 1978年&#xff0c;中国的GDP是3679亿。改革开放40多年&#xff0c;我们不断引进资本&#xf…

【嵌入式Linux】<总览> 网络编程(更新中)

文章目录 前言 一、网络知识概述 1. 网路结构分层 2. socket 3. IP地址 4. 端口号 5. 字节序 二、网络编程常用API 1. socket函数 2. bind函数 3. listen函数 4. accept函数 5. connect函数 6. read和recv函数 7. write和send函数 三、TCP编程 1. TCP介绍 2.…

Monaco 使用 DocumentFormattingEditProvider

文档格式化&#xff0c;是 VSCode 比较常用的功能&#xff0c;在文档上点击右键选择格式化文档。效果如下&#xff1a; 在 Monaco 通过 registerDocumentFormattingEditProvider 方法注册处理函数&#xff0c;实现 provider 方法。 provider 方法返回格式化好的代码。 TextE…

Android C++系列:Linux文件系统(二)

1. VFS虚拟文件系统 Linux支持各种各样的文件系统格式&#xff0c;如ext2、ext3、reiserfs、FAT、NTFS、iso9660 等等&#xff0c;不同的磁盘分区、光盘或其它存储设备都有不同的文件系统格式&#xff0c;然而这些文件系统 都可以mount到某个目录下&#xff0c;使我们看到一个…

Kafka(四) Consumer消费者

一&#xff0c;基础知识 1&#xff0c;消费者与消费组 每个消费者都有对应的消费组&#xff0c;不同消费组之间互不影响。 Partition的消息只能被一个消费组中的一个消费者所消费&#xff0c; 但Partition也可能被再平衡分配给新的消费者。 一个Topic的不同Partition会根据分配…

【C#】部分国家/语言,string字符串转decimal、float时,小数点解析异常、小数点丢失、小数点被忽略

现象&#xff1a; 部分国家地区&#xff0c;字符串转小数后&#xff0c;小数点丢失&#xff0c;比如&#xff1a;输入"12.34"&#xff0c;输出1234&#xff0c;而非12.34。 部分相关函数decimal.Parse、decimal.TryParse、float.Parse、float.TryParse 原因&…