【唐老狮】Unity——物理系统(碰撞检测)

article/2025/10/10 18:20:13

【学习目标】

碰撞检测

  1. 能够让两个游戏物体之间产生碰撞

  2. 能够让两个物体碰撞时表现出不同效果

  3. 能够通过代码检测到碰撞产生的不同阶段

  4. 能够使用触发器让两个物体相互穿透

  5. 能够通过代码检测到触发产生的不同阶段



【碰撞检测】

【碰撞的必要条件】

两个游戏物体(GameObject)之间

至少有一个物体有刚体组件(Rigidbody)

并且两个物体都有碰撞盒组件(Collider)



【实例】

 

 

上方物体挂载了刚体和碰撞盒

下方物体挂载了碰撞盒

运行后由于上方物体有刚体组件

并且Use Gravity默认勾选

所以它会受重力影响自由下落

图片

 



【刚体组件】

让游戏物体(GameObject)

受到力的作用

参数说明

红色字为重要参数

其余了解即可

Mass

对象的质量(默认为千克)

Drag

根据力移动对象时影响对象的空气阻力大小。0 表示没有空气阻力,无穷大使对象立即停止移动

Angular Drag

根据扭矩旋转对象时影响对象的空气阻力大小。0 表示没有空气阻力。请注意,如果直接将对象的 Angular Drag 属性设置为无穷大,无法使对象停止旋转。

Use Gravity

如果启用此属性,则对象将受重力影响。

Is Kinematic

如果启用此选项,则对象将不会被物理引擎驱动,只能通过 (Transform) 对其进行操作。对于移动平台,或者如果要动画化附加了 HingeJoint 的刚体,此属性将非常有用。

Interpolate

仅当在刚体运动中看到急动时才尝试使用提供的选项之一。

-None

不应用插值。

-Interpolate

根据前一帧的变换来平滑变换。

-Extrapolate

根据下一帧的估计变换来平滑变换。

Collision Detection

用于防止快速移动的对象穿过其他对象而不检测碰撞。

-Discrete

对场景中的所有其他碰撞体使用离散碰撞检测。其他碰撞体在测试碰撞时会使用离散碰撞检测。用于正常碰撞(这是默认值)。

-Continuous

对动态碰撞体(具有刚体)使用离散碰撞检测,并对静态碰撞体(没有刚体)使用基于扫掠的连续碰撞检测。设置为_连续动态 (Continuous Dynamic) 的刚体将在测试与该刚体的碰撞时使用连续碰撞检测。其他刚体将使用离散碰撞检测。用于连续动态 (Continuous Dynamic) 检测需要碰撞的对象。(此属性对物理性能有很大影响,如果没有快速对象的碰撞问题,请将其保留为 Discrete 设置)

-Continuous Dynamic

对设置为连续 (Continuous)和连续动态 (Continuous Dynamic)碰撞的游戏对象使用基于扫掠的连续碰撞检测。还将对静态碰撞体(没有刚体)使用连续碰撞检测。对于所有其他碰撞体,使用离散碰撞检测。用于快速移动的对象。

-Continuous Speculative

对刚体和碰撞体使用推测性连续碰撞检测。这也是可以设置运动物体的唯一 CCD 模式。该方法通常比基于扫掠的连续碰撞检测的成本更低。

Constraints

对刚体运动的限制。

-Freeze Position

有选择地停止刚体沿世界 X、Y 和 Z 轴的移动。

-Freeze Rotation

有选择地停止刚体围绕局部 X、Y 和 Z 轴旋转。



【碰撞盒组件们】

决定游戏物体(GameObject)

碰撞范围并产生

碰撞效果

常用碰撞盒

Box Collider(盒装碰撞盒)

Sphere Collider(球形碰撞盒)

Capsule Collider(胶囊碰撞盒)

不常用碰撞盒

性能消耗高

Wheel Collider(环状碰撞盒)

Mesh Collider(网格碰撞盒)

Terrain Collider(地形碰撞盒)

共有参数含义:

Is Trigger

是否是触发器,如果启用此属性,则该碰撞体将用于触发事件,并被物理引擎忽略

Material

物理材质,可以确定碰撞体和其它对象碰撞时的交互(表现)方式。

Center

碰撞体在对象局部空间中的中心点位置。

 

Size

碰撞体在X、Y、Z方向上的大小

 

Radius

球形碰撞体的半径大小

 

Radius

胶囊体的半径

Height

胶囊体的高度

Direction

胶囊体在对象局部空间中的轴向

 

Mass

车轮的质量

Radius

车轮的半径

Wheel Damping Rate

这是应用于车轮的阻尼值

Suspension Distance

车轮悬架的最大延伸距离(在局部空间中测量)。悬架始终向下延伸穿过局部 Y 轴。

Force App Point Distance

此参数定义车轮上的受力点。此距离应该是距车轮底部静止位置的距离(沿悬架行程方向),以米为单位。当 forceAppPointDistance = 0 时,受力点位于静止的车轮底部。较好的车辆会使受力点略低于车辆质心。

Suspension Spring

悬架尝试通过增加弹簧力和阻尼力来到达目标位置 (Target Position)

-Spring

弹簧力尝试到达目标位置。值越大,悬架达到目标位置就越快

-Damper

抑制悬架速度。值越大,悬架弹簧移动就越慢

-Target Position

悬架沿悬架距离 (Suspension Distance) 的静止距离。1 对应于完全展开的悬架,0 对应于完全压缩的悬架。默认值为 0.5,与常规汽车的悬架行为匹配。

Forward Friction

车轮向前滚动时轮胎摩擦的特性。

Sideways Friction

车轮侧向滚动时轮胎摩擦的特性。

-Extremum Slip

曲线的极值点。

-Extremum Value

曲线的极值点。

-Asymptote Slip

曲线的渐近点。

-Asymptote Value

曲线的渐近点。

-Stiffness

Extremum Value 和 Asymptote Value 的乘数(默认值为 1)。改变摩擦力的刚度。将此值设置为零将完全禁用车轮的所有摩擦力。通常在运行时修改刚度以使用脚本来模拟各种地面材质。

注意

不必通过转动或滚动 WheelCollider 对象来控制汽车;附加了 WheelCollider 的对象应始终相对于汽车本身固定

 

Convex

勾选此复选框可启用 Convex。如果启用此属性,该 Mesh Collider 将与其他 Mesh Collider 发生碰撞。Convex Mesh Collider 最多 255 个三角形。

Cooking Options

启用或禁用影响物理引擎对网格处理方式的网格烹制选项。

-None

禁用下方列出的所有 Cooking Options

-Everything

启用下方列出的所有 Cooking Options

-Cook for Faster Simulation

使物理引擎烹制网格以加快模拟速度。启用此设置后,这会运行一些额外步骤,以保证生成的网格对于运行时性能是最佳的。这会影响物理查询和接触生成的性能。禁用此设置后,物理引擎会使用更快的烹制速度,并尽可能快速生成结果。因此,烹制的 Mesh Collider 可能不是最佳的。

-Enable Mesh Cleaning

使物理引擎清理网格。启用此设置后,烹制过程会尝试消除网格的退化三角形以及其他几何瑕疵。此过程生成的网格更适合于在碰撞检测中使用,往往可生成更准确的击中点。

-Weld Colocated Vertices

使物理引擎在网格中删除相等的顶点。启用此设置后,物理引擎将合并具有相同位置的顶点。这对于运行时发生的碰撞反馈十分重要。

Mesh

引用需要用于碰撞的网格。

网格烹制

网格烹制将常规网格更改为可以在物理引擎中使用的网格。烹制会构建用于物理查询的空间搜索结构(如 Physics.Raycast)以及用于接触生成的支持结构。Unity 在碰撞检测中使用网格之前烹制所有这些网格。这可在导入时 (Import Settings > Model > Generate Colliders) 或运行时进行。

 

Terrain Data

地形数据

Enable Tree Colliders

选中此属性时,将启用树碰撞体

━━━━━━━━━━━━━━━━━━━━

完成目标一

能够让两个游戏物体之间产生碰撞

━━━━━━━━━━━━━━━━━━━━


【物理材质】

当物体之间发生碰撞时

物理材质决定碰撞体与其它对象的

交互方式(碰撞表现)

物理材质是和碰撞盒

结合使用的


【创建】
 

Project窗口

右键

Create

Physic Material

 

 

Dynamic Friction

已在移动时使用的摩擦力。通常为 0 到 1 之间的值。值为零就像冰一样,值为 1 将使对象迅速静止(除非用很大的力或重力推动对象)

Static Friction

当对象静止在表面上时使用的摩擦力。通常为 0 到 1 之间的值。值为零就像冰一样,值为 1 将导致很难让对象移动。

Bounciness

表面的弹性如何?值为 0 将不会反弹。值为 1 将在反弹时不产生任何能量损失,预计会有一些近似值,但可能只会给模拟增加少量能量。

Friction Combine

两个碰撞对象的摩擦力的组合方式。

-Average

对两个摩擦值求平均值。

-Minimum

使用两个值中的最小值。

-Maximum

使用两个值中的最大值。

-Multiply

两个摩擦值相乘。

Bounce Combine

两个碰撞对象的弹性的组合方式。其模式与 Friction Combine 模式相同



【实例】

 

把反弹力改为1

 

把这个物理材质

拖给两个立方体

运行后效果如下

 

通过设置物理材质

的各个参数

可以达到不同的

碰撞表现效果

━━━━━━━━━━━━━━━━━━━━

完成目标二

能够让两个物体碰撞时表现出不同效果

━━━━━━━━━━━━━━━━━━━━



【碰撞检测函数】

 

关键参数

Collision

 

将这个Test脚本

挂载到两个物体中的其中一个即可

 

运行时

当产生碰撞时

会自动调用对应函数

进行逻辑处理

 

━━━━━━━━━━━━━━━━━━━━

完成目标三

能够通过代码检测到碰撞产生的不同阶段

━━━━━━━━━━━━━━━━━━━━



【触发器】
 

可以让挂载刚体的物体

穿透碰撞盒(一箭穿心)

主要作用

不产生物理效果

只进行碰撞检测

通过响应函数处理对应逻辑

 

制作触发器非常简单,只需要在满足碰撞产生的必要条件的物体上,将带有刚体的物体上的碰撞盒的Is Trigger属性勾选上

 

运行效果

刚体对象可以穿透对方

没有物理碰撞效果

 

━━━━━━━━━━━━━━━━━━━━

完成目标四

能够使用触发器让两个物体相互穿透

━━━━━━━━━━━━━━━━━━━━



【触发检测函数】

 

关键参数

Collider

 

 

将这个Test脚本

挂载到有刚体的物体上即可

运行时

当产生触发时

会自动调用对应函数

进行逻辑处理

 

━━━━━━━━━━━━━━━━━━━━

完成目标五

能够通过代码检测到触发产生的不同阶段

━━━━━━━━━━━━━━━━━━━━


【总结】
 

完成了五个学习目标后

就能基本掌握物理系统的核心

其中最重要的内容是

碰撞产生的必要条件

刚体和碰撞盒组件上的核心参数

碰撞和触发检测的6个函数


关注唐老狮获取更多干货内容

 


http://chatgpt.dhexx.cn/article/OqYDCycA.shtml

相关文章

unity物理碰撞操作方案

经unity官方网站资料改写整理书写本博客,原网址方案链接如下: Lesson 2.4 - Collision Decisions - Unity Learn 首先 1.先创建两个物体 然后 2.给这两个物体加上Box Collider 组件,并勾选“是触发器”(英文:is 啥…

2D物理系统——碰撞器

1、碰撞器 碰撞器是用于在物理系统中表示物体体积的形状或范围,刚体通过得到碰撞器的范围信息进行计算,判断两个物体的范围是否接触,如果接触刚体就会模拟力的效果产生速度和旋转 2、2D碰撞器 补充: 边界碰撞器可以用作不规则地…

JavaScript 游戏开发:手把手实现碰撞物理引擎

目录 基础结构绘制小球移动小球重构代码碰撞检测边界碰撞向量的基本操作碰撞处理动量守恒定律动能守恒定律 非弹性碰撞重力总结 年前我看到合成大西瓜小游戏火了,想到之前从来没有研究过游戏方面的开发,这次就想趁着这个机会看看 JavaScript 游戏开发&am…

unity 物理碰撞

一 .意义 在游戏里经常会发生角色碰撞的场景,但是unity模型碰撞没有啥效果,就需要物理引擎。 物理引擎就是在游戏中模拟真实的物理效果。 二.刚体 Rigidbody( 刚体) 刚体组件可使游戏对象在物理系统的控制下运动,任何游戏对象只有添加刚…

【Unity探究】物理碰撞实验

这几天为了准备面试,所以决定对平时学习中的盲点扫盲一下,首先想到的就是物理碰撞。以前没有好好研究过,一直模糊不清,到底什么条件下才可以产生物理碰撞呢?只要其中一个有Rigidbody就可以了吗?所以进行了下…

物理系统碰撞相关原理及算法

1.物理模拟相关过程 1) 积分Integrate(物体运动位置和朝向的迭代) 2)碰撞检测 Collision Detect(检测碰撞体间是否接触以及相关碰撞信息) 1.粗略碰撞检测BroadPhase(粗略判断碰撞体间是否接触&…

Linux MySQL8.0.11版本升级到MySQL8.0.23【数据库备份】

因修复绿盟扫出来的一系列漏洞进行版本升级 msyql下载链接:https://dev.mysql.com/downloads/mysql/ 1.选择对应linux版本下载 有两种方式,一种是用rz命令选择文件直接上传。 没有rz命令,需要先下载: # yum -y install lrzsz #…

mysql进阶(二十八)GRANT REVOKE用法

文章目录 一、前言二、查看用户权限三、撤销已赋予给 MySQL 用户的权限四、grant、revoke 用户权限注意事项五、用户和权限管理命令六、 grant 权限七、拓展阅读 一、前言 MySQL权限系统围绕两个概念: 认证->确定用户是否允许连接数据库服务器;授权…

MySQL8.0.21升级到8.0.28(Linux)

需要提前准备好MySQL8.0.28的压缩包文件 1 查看当前mysql版本 2 停止当前运行的mysql service mysqld stop 3 将下载好的压缩包导入(8.0.28),解压压缩包 sudo tar -xvf mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz -C /usr/local/ 4 修改之前的文件名,将mysql改为mysqlol…

15天学习MySQL计划-锁(进阶篇)-第十天

15天学习MySQL计划-锁(进阶篇)-第十天 锁 1.概述 1.介绍 ​ 锁是计算机协调多个进程或线程并发访问某个资源的机制。数据库中,除传统的计算资源(cpu,ram,i/o)的争用以外,数据也是…

第21天 数据库 Mysql

MySQL 数据库 概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库 数据库分类 关系型数据库 关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系 型数据库中,对数…

MySQL进阶第一天

MySQL5.7之后,sql_mode中ONLY_FULL_GROUP_BY模式默认设置为打开状态。 ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在此模式下,target list中的值要么是来自于聚合函数&#xff…

04.28 MySQL

DQL:数据库的查询语句初学 1.查询全表数据 在查询之前,我们需要先创建一个所需的表 select *from 表名; [注意,实际开发中,写sql的时候,不能写**号,需要查询全表的时候,需要写全部的名称字段] select s.id as “编号”, s.name as “姓名”, s.age as “年龄”, s.math as “…

MySQL 总是差八个小时,如何破?

今天来聊一个简单的话题,这是一个小伙伴在微信上问我的,对于初学者我非常能理解这类问题带来的困扰,各种尝试,各种搜索,别人说的头头是道,但是就是解决不了自己的问题,今天我简单从两个方面来和…

存入mysql时间少了8小时

在接口测试的时候,发现时间少了8小时。通过网上各个博客发现了两个问题。 首先是显示在页面的时间格式(date)和我从api接口里测试的也不同。 时间格式的处理,前端的时间显示2020-07-13T16:02:00.0000000 在后端添加JsonFormat JsonFormat(shapeJsonFo…

mysql当日及后5天数据

java /mysql统计当天及前六天的数据,如果中间哪天数据为空,怎么在相应的位置插入动态的时间 你可以在查询出结果之后,生成JSON的时候,在那里判断一下后面时间不是与前面的时间相差一天,如果不是,把这天数据…

MYSQL 第六天

课堂作业 1. 创建数据库company,在库中创建两个表offices和employees表 小鹅通作业 1.用SQL语句创建学生表student,定义主键,姓名不能重名,性别只能输入男或女,所在系的默认值是 “计算机”。 create table student( Sno int p…

MySQL高级篇第二天

文章目录 一、Mysql的体系结构概览 二、 存储引擎 三、优化SQL步骤 一、Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理服务和工具组件 SQL Interface : SQL接口组件 Parser : 查询分析器组件 O…

MySql(第二天)

文章目录 数据库查询操作1.单表查询2.多表查询3.MySql远程连接 数据库查询操作 1.单表查询 --数据库操作前的准备 -- 创建数据库 -- create database python_test_1 charsetutf8;-- 使用数据库 -- use python_test_1;-- students表 -- create table students( -- id int …

mysql查询0~3天、4~7天、8~15天、16~30天的sql语句

1、NOW(), CURDATE(), CURTIME()的值 2、date_add(now(), interval 1 day) //当前时间加一天 date_sub(now(), interval 1 day) //当前时间减一天 3、简单函数 CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END 搜索函数 CASE WHEN [expr] THEN [result1]……