Untiy基础学习(十四)核心系统—物理系统之碰撞检测代码篇 刚体,碰撞体,材质
目录
一、碰撞器(Collider)与触发器(Trigger)
二、碰撞检测条件
三、碰撞事件与触发器事件,可以理解为特殊的生命周期函数。
四、讲讲如何选择
编辑
五、总结
一、碰撞/触发事件函数对照表
二、Collider 与 Collision 参数属性对照表
1. Collider 类参数(用于触发器事件)
2. Collision 类参数(用于碰撞事件)
三、结构体参数展开
1. ContactPoint(碰撞接触点)
2. Bounds(包围盒)
前面两篇文章中,我们详细的了解了,Rigidbody刚体,以及各种碰撞器相关的内容。同时我们也清楚了碰撞的条件:两个物体都必须有碰撞器,并且至少一个物体上面存在刚体。并回答了两个问题:如何让两个物体碰撞时产生不同的碰撞效果(设置他们的物理材质,两个物体身上的物理材质都要设置)触发器的作用是什么(让两个物体碰撞没有物理效果 只进行碰撞处理)
所以今天我们来看看有哪些和代码相关的内容以及前情回顾:
一、碰撞器(Collider)与触发器(Trigger)
碰撞器
作用:检测物体间的物理碰撞,并产生物理反馈(如反弹)。
组件:Box Collider、Sphere Collider、Capsule Collider等。
静态物体:无Rigidbody的碰撞器(如地面),用于阻挡动态物体。
触发器
启用方式:勾选Collider组件的Is Trigger。
行为:物体穿透时触发事件,无物理反馈(如收集金币)。
二、碰撞检测条件
必要条件:
两个物体均需附加Collider组件。
至少一个物体附加Rigidbody组件(动态物体)。
触发检测时,至少一个物体勾选Is Trigger。
三、碰撞事件与触发器事件,可以理解为特殊的生命周期函数。
碰撞事件(需关闭Is Trigger):
OnCollisionEnter(Collision other):碰撞开始时调用。
OnCollisionStay(Collision other):碰撞持续中每帧调用。
OnCollisionExit(Collision other):碰撞结束时调用。
相关参数Collision介绍:
Collision 类型参数存储了碰撞的详细信息,可通过其属性获取碰撞对象的关键数据:
other.gameObject
作用:获取碰撞到的另一物体的 GameObject 引用。
用途:用于判断碰撞对象身份(如标签、名称)、操作对方物体(如销毁、施加力)。
if (other.gameObject.CompareTag("Enemy")) {Destroy(other.gameObject); // 销毁敌人
}
other.contactOffset
contactOffset 是一个 距离阈值,表示两个碰撞器之间生成接触点的最小间隔。
默认值:0.01 米(在 Unity 的 Project Settings > Physics 中可全局修改)。
单位:世界坐标系中的米(meters)。
当两个碰撞器的距离 小于等于 contactOffset 时,物理引擎会开始生成接触点(即触发碰撞事件)。
若距离 大于 contactOffset,则不会触发碰撞事件。
other.contacts
作用:获取碰撞接触点的数组(ContactPoint[])。这是一个结构体数组
用途:计算碰撞位置或生成特效。
Vector3 firstContactPoint = other.contacts[0].point; // 第一个接触点坐标
Instantiate(explosionEffect, firstContactPoint, Quaternion.identity);
ContactPoint 结构体的核心属性
point(坐标点)
类型:Vector3
作用:碰撞接触点的世界坐标系坐标。
用途:在精确位置生成特效(如火花、弹痕)或计算受力点。
normal(法线方向)
类型:Vector3
作用:碰撞接触点的法线方向(垂直于碰撞表面的方向)。
用途:计算反弹方向、滑动行为或伤害方向判定。
separation(分离距离)
类型:float
作用:两个碰撞器在接触点的分离距离(负数表示穿透深度)。
用途:检测碰撞的剧烈程度(如穿透深度过大时触发特殊逻辑)。
thisCollider 与 otherCollider
类型:Collider
作用:
thisCollider:当前脚本所在物体的碰撞器。
otherCollider:对方物体的碰撞器。
用途:区分碰撞器来源(如区分玩家身体的不同部位碰撞)。
other.impulse
作用:获取碰撞的冲量(Vector3 类型)。
用途:计算碰撞力度(如伤害值)。
float damage = other.impulse.magnitude * 0.1f;
health -= damage;
other.collider
存在替代方案:通过 other.gameObject.GetComponent<Collider>() 获取碰撞器。
Collider collider = other.gameObject.GetComponent<Collider>();
if (collider != null) {collider.enabled = false; // 禁用对方碰撞器
}
触发器事件(需启用Is Trigger):
OnTriggerEnter(Collider other):进入触发器时调用。
OnTriggerStay(Collider other):停留在触发器内时每帧调用。
OnTriggerExit(Collider other):离开触发器时调用。
相关参数Collider的介绍
other.gameObject 和上面一样
作用:获取触发器的所属 GameObject。
用途:检测触发对象身份或操作触发物体。
if (other.gameObject.name == "HealthPack") {playerHealth += 20;Destroy(other.gameObject); // 拾取血包
}
other.bounds
作用:获取触发器的包围盒(Bounds 类型)。
用途:计算触发器的尺寸或位置。
Vector3 triggerCenter = other.bounds.center; // 触发器中心坐标
other.isTrigger
作用:检查该碰撞器是否作为触发器使用。
用途:避免误判非触发器物体。
if (other.isTrigger) {Debug.Log("触发了一个触发器对象");
}
两个实例脚本:
(1)模拟子弹碰撞到一个物体上面:
private void OnCollisionEnter(Collision other) {if (other.gameObject.CompareTag("Enemy")) {// 获取敌人脚本并造成伤害Enemy enemy = other.gameObject.GetComponent<Enemy>();if (enemy != null) {enemy.TakeDamage(10);}// 在接触点生成爆炸特效ContactPoint contact = other.contacts[0];Instantiate(explosionPrefab, contact.point, Quaternion.identity);// 销毁子弹自身Destroy(gameObject);}
}
(2)进入可以的传送区域
private void OnTriggerEnter(Collider other) {if (other.CompareTag("Player")) {// 获取玩家坐标并传送Vector3 teleportPosition = new Vector3(0, 5, 0);other.transform.position = teleportPosition;// 播放音效AudioSource.PlayClipAtPoint(teleportSound, transform.position);}
}
四、讲讲如何选择
1.只要挂载的对象 能和别的物体产生碰撞或者触发 那么这六个函数就都能够被响应
2.6个函数不是说我们都要写 我们一般是根据需求来进行选择书写
3.如果是一个异形物体 刚体在父对象上 如果你想通过子对象上挂脚本检测碰撞是行不通的 必须挂载到这个刚体父对象上才行
4.要明确 物理碰撞和触发器响应的区别
在下面可以决定哪些对象的碰撞情况,在 Unity 中,Layer Collision Matrix(层碰撞矩阵) 是一个用于控制不同层级(Layer)之间碰撞检测是否生效的核心工具。它的作用是通过选择性启用或禁用特定层之间的碰撞,优化物理计算性能,并实现特定交互逻辑。注意,最好对称的,
五、总结
一、碰撞/触发事件函数对照表
函数名 | 类型 | 触发条件 | 参数类型 | 用途 |
---|---|---|---|---|
OnCollisionEnter | 碰撞事件 | 两物体碰撞开始时 | Collision | 处理碰撞开始逻辑(如伤害、音效) |
OnCollisionStay | 碰撞事件 | 两物体碰撞持续中每帧 | Collision | 处理持续接触逻辑(如摩擦音效) |
OnCollisionExit | 碰撞事件 | 两物体碰撞结束时 | Collision | 处理碰撞结束逻辑(如状态重置) |
OnTriggerEnter | 触发器事件 | 物体进入触发器范围时 | Collider | 处理触发开始逻辑(如拾取道具、传送) |
OnTriggerStay | 触发器事件 | 物体停留在触发器内每帧 | Collider | 处理持续触发逻辑(如持续治疗、区域伤害) |
OnTriggerExit | 触发器事件 | 物体离开触发器范围时 | Collider | 处理触发结束逻辑(如离开区域提示) |
二、Collider
与 Collision
参数属性对照表
1. Collider
类参数(用于触发器事件)
属性/方法 | 类型 | 作用 | 示例 |
---|---|---|---|
gameObject | GameObject | 获取触发器的所属对象 | if (other.gameObject.CompareTag("Player")) { ... } |
bounds | Bounds | 获取触发器的包围盒(包含中心、尺寸等) | Vector3 center = other.bounds.center; |
isTrigger | bool | 检查该碰撞器是否作为触发器 | if (other.isTrigger) { Debug.Log("触发的是触发器"); } |
contactOffset | float | 控制接触点生成的距离阈值(可全局或单独设置) | GetComponent<Collider>().contactOffset = 0.05f; |
attachedRigidbody | Rigidbody | 获取该碰撞器关联的刚体(若有) | Rigidbody rb = other.attachedRigidbody; |
2. Collision
类参数(用于碰撞事件)
属性/方法 | 类型 | 作用 | 示例 |
---|---|---|---|
gameObject | GameObject | 获取碰撞到的对方对象 | if (collision.gameObject.name == "Wall")) { ... } |
contacts | ContactPoint[] | 碰撞接触点数组(包含坐标、法线等) | Vector3 point = collision.contacts[0].point; |
impulse | Vector3 | 碰撞的冲量(力度和方向) | float force = collision.impulse.magnitude; |
collider (已过时) | Collider | 对方碰撞器(建议改用 gameObject.GetComponent<Collider>() ) | Collider col = collision.gameObject.GetComponent<Collider>(); |
三、结构体参数展开
1. ContactPoint
(碰撞接触点)
属性 | 类型 | 作用 |
---|---|---|
point | Vector3 | 接触点的世界坐标(用于特效生成) |
normal | Vector3 | 接触点法线方向(用于反弹计算) |
separation | float | 两碰撞器的分离距离(负数表示穿透深度) |
thisCollider | Collider | 当前脚本所在物体的碰撞器 |
otherCollider | Collider | 对方物体的碰撞器 |
2. Bounds
(包围盒)
属性 | 类型 | 作用 |
---|---|---|
center | Vector3 | 包围盒中心坐标 |
size | Vector3 | 包围盒尺寸(长宽高) |
extents | Vector3 | 包围盒半尺寸(size / 2 ) |
min /max | Vector3 | 包围盒最小/最大角坐标 |
相关文章:

Untiy基础学习(十四)核心系统—物理系统之碰撞检测代码篇 刚体,碰撞体,材质
目录 一、碰撞器(Collider)与触发器(Trigger) 二、碰撞检测条件 三、碰撞事件与触发器事件,可以理解为特殊的生命周期函数。 四、讲讲如何选择 编辑 五、总结 一、碰撞/触发事件函数对照表 二、Collider 与 …...

SAP学习笔记 - 开发08 - Eclipse连接到 BTP Cockpit实例
有关BTP,之前学了一点儿,今天继续学习。 SAP学习笔记 - 开发02 - BTP实操流程(账号注册,BTP控制台,BTP集成开发环境搭建)_sap btp开发-CSDN博客 如何在Eclipse中连接BTP Cockpit开发环境实例。 1…...
如何用Redis实现分布式锁?RedLock算法的核心思想?Redisson的看门狗机制原理?
一、Redis分布式锁基础实现 public class RedisDistributedLock {private JedisPool jedisPool;private String lockKey;private String clientId;private int expireTime 30; // 默认30秒public boolean tryLock() {try (Jedis jedis jedisPool.getResource()) {// NX表示不…...
Java项目层级介绍 java 层级 层次
java 层级 层次 实体层 控制器层 数据连接层 Service : 业务处理类 Repository :数据库访问类 Java项目层级介绍 https://blog.csdn.net/m0_67574906/article/details/145811846 在Java项目中,层级结构(Layered Architecture…...

Git的安装和配置(idea中配置Git)
一、Git的下载和安装 前提条件:IntelliJ IDEA 版本是2023.3 ,那么配置 Git 时推荐使用 Git 2.40.x 或更高版本 下载地址:CNPM Binaries Mirror 操作:打开链接 → 滚动到页面底部 → 选择2.40.x或更高版本的 .exe 文件…...

【2025版】Spring Boot面试题
文章目录 1. Spring, Spring MVC, SpringBoot是什么关系?2. 谈一谈对Spring IoC的理解3. Component 和 Bean 的区别?4. Autowired 和 Resource 的区别?5. 注入Bean的方法有哪些?6. 为什么Spring 官方推荐构造函数注入?…...

火山引擎实时音视频 高代码跑通日志
实时音视频 SDK 概览--实时音视频-火山引擎 什么是实时音视频 火山引擎实时音视频(Volcengine Real Time Communication,veRTC)提供全球范围内高可靠、高并发、低延时的实时音视频通信能力,实现多种类型的实时交流和互动。 通…...
atoi函数,sprintf函数,memcmp函数,strchar函数的具体原型,功能,返回值;以及使用方法
以下是这四个C语言标准库函数的详细说明: 1. atoi() - 字符串转整数 **原型**: int atoi(const char *str); **功能**: 将字符串参数str转换为整数(int类型)。函数会跳过前面的空白字符(如空格、制表符&am…...
C++学习之打车软件git版本控制
目录 01 3-git的简介 02 4-git的下载和提交代码 03 5-git添加一个新文件 04 5-删除一个文件 05 6-git的批量添加和提交文件 06 7-git重命名文件名 07 8-git解决代码冲突 08 9-git的分支的概念 09 10-创建项目代码仓库 10 1-git提交代码复习 01 3-git的简介 1 --------…...
基于 PostgreSQL 的 ABP vNext + ShardingCore 分库分表实战
🚀 基于 PostgreSQL 的 ABP vNext ShardingCore 分库分表实战 📑 目录 🚀 基于 PostgreSQL 的 ABP vNext ShardingCore 分库分表实战✨ 背景介绍🧱 技术选型🛠️ 环境准备✅ Docker Compose(多库 & 读…...

jenkins 启动报错
java.lang.UnsatisfiedLinkError: /opt/application/jdk-17.0.11/lib/libfontmanager.so: libfreetype.so.6: cannot open shared object file: No such file or directory。 解决方案: yum install freetype-devel 安装完成之后重启jenkins。...
C++ 套接字函数详细介绍
目录 头文件1. 套接字创建与配置2. 绑定地址与端口3. 连接建立4. 数据传输5. 套接字选项6. 地址转换7. 套接字关闭8. 其他实用函数 C 套接字函数详细介绍 套接字(Socket)是网络通信的基本端点,C中通常使用BSD套接字API进行网络编程。以下是主要的套接字相关函数及其…...

【合新通信】无人机天线拉远RFOF(射频光纤传输)解决方案
无人机天线拉远RFOF方案通过光纤替代传统射频电缆,实现无人机与地面控制站之间的高保真、低损耗信号传输,尤其适用于高频段(如毫米波)、远距离或复杂电磁环境下的无人机作业场景。 核心应用场景 军事侦察与电子战 隐蔽部署&…...

程序设计语言----软考中级软件设计师(自用学习笔记)
目录 1、解释器和编译器 2、程序的三种控制结构 3、程序中的数据必须具有类型 4、编译、解释程序翻译阶段 5、符号表 6、编译过程 7、上下文无关文法 8、前、中、后缀表达式 9、前、后缀表达式计算 10、语法树中、后序遍历 11、脚本语言和动态语言 12、语法分析方法…...
火山RTC 7 获得远端裸数据
一、获得远端裸数据 1、获得h264数据 1)、远端编码后视频数据监测器 /*** locale zh* type callback* region 视频管理* brief 远端编码后视频数据监测器<br>* 注意:回调函数是在 SDK 内部线程(非 UI 线程)同步抛出来的&a…...

通过SMTP协议实现Linux邮件发送配置指南
一、环境准备与基础配置 1. SMTP服务开通(以qq邮箱为例) 登录qq邮箱网页端,进入「设置」-「POP3/SMTP/IMAP」 开启「SMTP服务」并获取16位授权码(替代邮箱密码使用) 记录关键参数: SMTP服务器地址&#…...

若依框架页面
1.页面地址 若依管理系统 2.账号和密码 管理员 账号admin 密码admin123 运维 账号yuwei 密码123456 自己搭建的地址方便大家学习,不要攻击哦,谢谢啊...

44、私有程序集与共享程序集有什么区别?
私有程序集(Private Assembly)与共享程序集(Shared Assembly)是.NET框架中程序集部署的两种不同方式,它们在部署位置、版本控制、访问权限等方面存在显著差异,以下是对二者的详细比较: 1. 部署…...

【Java面试题】——this 和 super 的区别
🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:【Java】内容概括 【前言】 在Java的世界里,this和 super是两个非常重要且容易混淆的关键字。无论是在日常…...
记录 QT 在liunx 下 QFileDialog 类调用问题 ()Linux下QFileDialog没反应)
1. 2025.05.14 踩坑记录 因为QT 在 liunx 文件系统不同导致的 Windows : QString filePath QFileDialog::getOpenFileName(nullptr, "选择文件", ".", "文本文件 (*.txt);所有文件 (*.*)"); 没问题 liunx 下 打不开ÿ…...

CentOS 7 内核升级指南:解决兼容性问题并提升性能
点击上方“程序猿技术大咖”,关注并选择“设为星标” 回复“加群”获取入群讨论资格! CentOS 7 默认搭载的 3.10.x 版本内核虽然稳定,但随着硬件和软件技术的快速发展,可能面临以下问题: 硬件兼容性不足:新…...
【前端】:单 HTML 去除 Word 批注
在现代办公中,.docx 文件常用于文档编辑,但其中的批注(注释)有时需要在分享或归档前被去除。本文将从原理出发,深入剖析如何在纯前端环境下实现对 .docx 文件注释的移除,并提供完整的实现源码。最后&#x…...

解决 PicGo 上传 GitHub图床及Marp中Github图片编译常见难题指南
[目录] 0.行文概述 1.PicGo图片上传失败 2.*关于在Vscode中Marp图片的编译问题* 3.总结与启示行文概述 写作本文的动机是本人看到了Awesome Marp,发现使用 Markdown \texttt{Markdown} Markdown做PPT若加持一些 CSS , JavaScript \texttt{CSS},\texttt{JavaScript} …...

软考 系统架构设计师系列知识点之杂项集萃(59)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(58) 第96题 假设关系模式R(U, F),属性集U{A, B, C},函数依赖集F{A->B, B->C}。若将其分解为p{R1(U1, F1), R2(U2, F2),其中U1{A, B}, U2{A, …...

python使用matplotlib画图
【README】 plot画图有两种方法:包括 plt.plot(), ax.plot()-画多个子图 ,其中ax表示某个坐标轴; 【1】画单个图 import matplotlib # 避免兼容性问题:明确指定 matplotlib 使用兼容的后端,TkAgg 或 Agg matplotlib.use(TkAgg) …...
鸿蒙OSUniApp 开发实时聊天页面的最佳实践与实现#三方框架 #Uniapp
使用 UniApp 开发实时聊天页面的最佳实践与实现 在移动应用开发领域,实时聊天功能已经成为许多应用不可或缺的组成部分。本文将深入探讨如何使用 UniApp 框架开发一个功能完善的实时聊天页面,从布局设计到核心逻辑实现,带领大家一步步打造专…...

upload-labs通关笔记-第5关 文件上传之.ini绕过
目录 一、ini文件绕过原理 二、源码审计 三、渗透实战 1、查看提示 2、制作.user.ini文件 (1)首先创建一个文本文件 (2)保存文件名为.user.ini 2、制作jpg后缀脚本 (1)创建一个文本文件 …...

ssti模板注入学习
ssti模板注入原理 ssti模板注入是一种基于服务器的模板引擎的特性和漏洞产生的一种漏洞,通过将而已代码注入模板中实现的服务器的攻击 模板引擎 为什么要有模板引擎 在web开发中,为了使用户界面与业务数据(内容)分离而产生的&…...

填涂颜色(bfs)
归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言📝 含泪播种的人一定能含笑收获! 题目描述 由数字 0 0 0 组成的方阵中,有一任意形状的由数字 1 1 1 构成的闭合圈。现…...

ros1+docker环境快速搭建
快速使用python 解析ros1的bag消息ros这个东西可以说安装起来非常麻烦的,费时费力,很可能还安装不成功,特别是我的环境是ubuntu22.04 ,官方都不支持安装ros1。因此一个可行且快速的方法是使用别人配置好的ros的docker环境 一、下…...