找回密码
 立即注册
查看: 351|回复: 5

[笔记] unity如何检测两个特定物体的碰撞?

[复制链接]
发表于 2023-2-24 08:49 | 显示全部楼层 |阅读模式
如何在unity中实现仅针对某一特定物体的碰撞触发事件,同时其他的碰撞有碰撞效果但是不触发事件。在网上只能找到忽略碰撞的方法。
发表于 2023-2-24 08:51 | 显示全部楼层
【学习目标】

碰撞检测


  • 能够让两个游戏物体之间产生碰撞
  • 能够让两个物体碰撞时表现出不同效果
  • 能够通过代码检测到碰撞产生的不同阶段
  • 能够使用触发器让两个物体相互穿透
  • 能够通过代码检测到触发产生的不同阶段
<hr/>【碰撞检测】

【碰撞的必要条件】

两个游戏物体(GameObject)之间,至少有一个物体有刚体组件(Rigidbody),并且两个物体都有碰撞盒组件(Collider)
<hr/>【实例】





上方物体挂载了刚体和碰撞盒,下方物体挂载了碰撞盒,运行后由于上方物体有刚体组件,并且Use Gravity默认勾选,所以它会受重力影响自由下落


<hr/>【刚体组件】


让游戏物体(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 轴旋转。
<hr/>【碰撞盒组件们】

决定游戏物体(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 ValueAsymptote 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
选中此属性时,将启用树碰撞体
━━━━━━━━━━━━━━━━━━━━
完成目标一
能够让两个游戏物体之间产生碰撞
━━━━━━━━━━━━━━━━━━━━
<hr/>【物理材质】


当物体之间发生碰撞时,物理材质决定碰撞体与其它对象的交互方式(碰撞表现)
物理材质是和碰撞盒结合使用的
<hr/>【创建】


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 模式相同
<hr/>【实例】




把反弹力改为1



把这个物理材质拖给两个立方体运行后效果如下


通过设置物理材质的各个参数,可以达到不同的碰撞表现效果
━━━━━━━━━━━━━━━━━━━━
完成目标二
能够让两个物体碰撞时表现出不同效果
━━━━━━━━━━━━━━━━━━━━
<hr/>【碰撞检测函数】




关键参数
Collision



将这个Test脚本挂载到两个物体中的其中一个即可



运行时,当产生碰撞时会自动调用对应函数进行逻辑处理


━━━━━━━━━━━━━━━━━━━━
完成目标三
能够通过代码检测到碰撞产生的不同阶段
━━━━━━━━━━━━━━━━━━━━
<hr/>【触发器】


可以让挂载刚体的物体穿透碰撞盒(一箭穿心)

主要作用
不产生物理效果,只进行碰撞检测,通过响应函数处理对应逻辑




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



运行效果
刚体对象可以穿透对方,没有物理碰撞效果



━━━━━━━━━━━━━━━━━━━━
完成目标四
能够使用触发器让两个物体相互穿透
━━━━━━━━━━━━━━━━━━━━
<hr/>【触发检测函数】





关键参数
Collider





将这个Test脚本挂载到有刚体的物体上即可


运行时,当产生触发时会自动调用对应函数进行逻辑处理



━━━━━━━━━━━━━━━━━━━━
完成目标五
能够通过代码检测到触发产生的不同阶段
━━━━━━━━━━━━━━━━━━━━
<hr/>【总结】



完成了五个学习目标后就能基本掌握物理系统的核心,其中最重要的内容是
碰撞产生的必要条件
刚体和碰撞盒组件上的核心参数
碰撞和触发检测的6个函数
<hr/>关注唐老狮获取更多干货内容

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2023-2-24 08:53 | 显示全部楼层
unity碰撞之检测特定物体碰撞后触发的事件_吾爱分享-享你所想-源码开源-教程素材分享-程序员社区可以看下这篇文章,里面有写到unity特定物体碰撞
发表于 2023-2-24 08:54 | 显示全部楼层
针对某一物体设置一个tag标签,当移动的物体与其他物体发生碰撞时判断碰撞物体的标签是否等于自己设定特定物体tag,如果是就触发事件,不是就不触发。
发表于 2023-2-24 08:57 | 显示全部楼层
Edit --> Project Settings --> Physics/Physics 2D --> Layer Collision Matrix,下面勾选哪个层级的碰撞体能相互碰撞,哪个不能。这里的layer 是指控制面板中的layer属性,不是tag属性,不要混淆
发表于 2023-2-24 09:05 | 显示全部楼层
collider和collision都是可以取到其gameobject名字的,不同的collider类型也是可以区分开的,所以在碰撞时针对检测到的对象再筛选一次名字或tag就可以抓到特定的家伙了
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-4-26 14:37 , Processed in 0.153656 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表