unity笔记:2D刚体与碰撞

目录

关于刚体休眠:

2D 刚体工作原理

组件详解

【BodyType】 

【Simulated】

【Collision Detection】

【Gravity Scale】

【Sleeping Mode】

【Interpolate】

【Constraints】

脚本调用

ProjectSettings-Physics2D

两个物体发生碰撞事件的前提是:运动的那个要有刚体。

手册:https://docs.unity3d.com/2019.1/Documentation/Manual/class-Rigidbody2D.html

以下内容大部分为手册内容,紫色字体为个人解读仅供参考。

关于刚体休眠

Rigidbody sleeping happens completely automatically. Whenever a rigidbody is slower than the sleepAngularVelocity and sleepVelocity it will start falling asleep. After a few frames of resting it will then be set to sleep. When the body is sleeping, no collision detection or simulation will be performed anymore. This saves a lot of CPU cycles.

刚体休眠完全自动发生。只要刚体的速度低于sleepAngularVelocitysleepVelocity,该刚体就会开始休眠。其空闲一些帧后,就会被设置成休眠状态。处于休眠状态中的物体,不会再对其进行碰撞检测和模拟。这会节约大量的CPU开销。

sleepAngularVelocity 和 sleepVelocity 可以在(Edit -> Project Settings -> Physics)修改。

2D 刚体工作原理

  • 刚体的用途

通常,Unity Editor 的 Transform 组件定义 GameObject(及其子游戏对象)在场景中的位置、旋转和缩放方式。当Transform被改变,它会更新其他组件,例如将对象渲染在哪里或 colliders 的位置之类的属性。2D 物理引擎可以移动 colliders并使它们相互作用,因此物理引擎需要一种方法将 colliders的移动传回Transform组件。此移动以及与colliders的连接便是 2D 刚体组件的用途。 

  • 不要修改Transform组件

2D 刚体组件会覆盖Transform组件,并将其更新为 2D 刚体定义的位置/旋转。请注意,虽然仍然可以通过自行修改Transform组件来覆盖 2D 刚体(因为 Unity 会公开所有组件上的所有属性),但是这样会导致各种问题,例如游戏对象相互穿透或嵌入、以及不可预测的移动。

  • 附加到2D刚体的Colliders

所有被添加到同一游戏对象或子对象的 2D colliders 组件都会被隐式附加到该 2D 刚体2D colliders被附加到 2D 刚体时,会随之移动。严禁使用Transform组件或任何colliders偏移来直接移动 2D colliders;而应移动 2D 刚体。这将提供最佳性能并确保正确的碰撞检测。连接到同一 2D 刚体的多个 2D colliders不会相互碰撞。这意味着可以创建一组colliders来有效充当一个复合colliders,使所有colliders都与 2D 刚体同步移动和旋转。

设计场景时,可自由使用默认的 2D 刚体并开始附加colliders。这些colliders可使连接到不同 2D 刚体的任何其他colliders相互碰撞。

组件详解

  • 【BodyType】 

 此选项决定了:

  • 移动行为(位置&旋转)” (对象能以何种方式发生位移/旋转)
  • 碰撞器交互(对象能与哪些类型的刚体发生碰撞)

请注意,虽然 Rigidbody 2Ds 通常被描述为相互碰撞,但碰撞的是这些物体中的每一个的 Collider 2Ds。如果没有碰撞器,刚体 2D 不能相互碰撞。

移动行为

可发生碰撞的刚体类型

(即:能触发函数回调的类型)

性能消耗

Dynamic

(动态)

默认类型

模拟会移动的物体。

运动方式:

  • 脚本 - velocity
  • 脚本 - 作用力(AddFroce
  • 重力
  • 碰撞
全部最高

Kinematic

(运动学)

模拟会移动、但仅在明确的用户控制下运动的物体。不会因物理模拟移动。

运动方式:

碰撞时无法被撼动(无限质量)。

[ x ] Use Full Kinematic

仅 Dynamic

[ ] Use Full Kinematic:

全部

Static

(静态)

模拟不会移动的物体(具有无限质量 不可移动)

velocity、AddForce、gravity、MovePosition、MoveRotation都不可用

仅 Dynamic最低

  • Dynamic - 默认类型

最常见、功能最全、性能消耗最大。位移可以受Velocity、作用力、重力、碰撞影响。

Dynamic 刚体被设计为在simulation条件下移动。它具有可用的全套属性(例如有限质量和阻力),并受作用力重力的影响。Dynamic 刚体类型可以与所有其他刚体类型碰撞,是最具互动性的刚体类型。这是需要移动的对象最常见的刚体类型,因此是 2D 刚体的默认刚体类型。此外,由于具有动态性并与周围所有对象互动,因此也是性能成本最高的刚体类型。所有 Rigidbody 2D 属性都可用于此BodyType。 

不要使用 Transform 组件来设置 Dynamic 2D刚体的位置或旋转。模拟系统会根据 Dynamic 2D 刚体的速度(velocity)对该刚体重新定位;可以通过脚本,对刚体施加来直接更改此值,也可以通过碰撞重力来间接更改此值。

  • Kinematic

性能更好。运动完全依赖用户的脚本控制,碰撞虽可以被检测到,但无法影响其行动轨迹

Kinematic 刚体设计为在simulation条件下移动,但是仅在非常明确的用户控制下进行。 

Kinematic 2D 刚体不会作用力重力的影响,因此,Kinematic 的速度很快,与 Dynamic 2D 刚体相比,对系统资源的需求更低。Kinematic 2D 刚体被设计为通过 Rigidbody2D.MovePosition 或 Rigidbody2D.MoveRotation 进行显式重新定位。使用物理查询来检测碰撞,通过脚本确定 2D 刚体移动的位置和方式。

Kinematic 2D 刚体仍然通过速度(velocity)移动,但是此velocity不受作用力重力的影响。Kinematic 2D 刚体不会与其他 Kinematic 2D 刚体和 Static 2D 刚体碰撞,只会与 Dynamic 2D 刚体碰撞。与 Static 2D 刚体相似,Kinematic 2D 刚体在碰撞期间的行为类似于不可移动的对象(就像具有无限质量)。选择此刚体类型时,与质量相关的属性将不可用。 

[  ] Use Full Kinematic Contacts 选项

不勾选:只检测与Dynamic 2D 刚体的碰撞

勾选:检测与全部BodyType刚体的碰撞(只是能检测到,并不会在物理模拟层面产生影响)

默认情况下会取消选中此框。如果希望 Kinematic 2D 刚体与所有 2D 刚体类型能够监测到碰撞,请启用此设置(选中复选框)。这种情况下类似于 Dynamic 2D 刚体,不同之处在于 Kinematic 2D 刚体在接触另一 2D 刚体组件时不会被物理引擎移动,而会充当一个具有无限质量不可移动对象

禁用 Use Full Kinematic Contacts 时,Kinematic  2D 刚体只会与 Dynamic 2D 刚体碰撞,不会与其他 Kinematic 2D 刚体或 Static 2D 刚体碰撞(请注意Trigger碰撞器是此规则的例外情况)。这意味着不会发生碰撞脚本回调(OnCollisionEnterOnCollisionStayOnCollisionExit

假如你要使用物理查询(例如 Physics.Raycast)来检测 2D 刚体应该移动的位置和方式时,以及需要多个 Kinematic 2D 刚体相互交互时,可能会很不方便。这时你可以启用 Use Full Kinematic Contacts 使 Kinematic 2D 刚体产生交互。

Use Full Kinematic Contacts 允许显式控制 Kinematic 2D 刚体的位置和旋转,但是仍然允许完全碰撞回调。在需要显式控制所有 Rigidbody 2D 的设置中,使用 Kinematic Rigidbody 2D 代替 Dynamic Rigidbody 2D 仍具有完整的碰撞回调支持。

  • Static

Static 2D 刚体设计为在simulation条件下完全不动;如果任何对象与 Static 2D 刚体碰撞,Static刚体的行为就像一个不可移动的物体(就像它有无限的质量)。此刚体类型也是使用资源最少的刚体类型。Static 刚体只能与 Dynamic 2D 刚体碰撞。不支持两个 Static 2D 刚体进行碰撞,因为这种刚体不是为了移动而设计的。

可通过两种方法将 2D 刚体标记为  Static :

1.对于具有 2D collider组件的游戏对象,不附加 2D 刚体组件。所有此类 2D 碰撞体在内部均视为已附加到单个隐藏的 Static 2D 刚体组件。(如果对象只添加了Collider组件,没有添加Rigidbody组件,效果等同于添加了一个Static刚体组件。)

2.让 GameObject 拥有一个 Rigidbody 2D 并将该 Rigidbody 2D 设置为Static。

方法 1 是创建 Static类型的 2D碰撞体的快速方法。当要创建大量 Static 类型的 2D 碰撞体时,不用为每个具有 2D Collider的游戏对象都添加 2D 刚体。

方法 2 用于提高性能。如果需要在运行时移动或重新配置 Static 2D 碰撞体,该碰撞体具有自己的 2D 刚体时完成这些操作会更快。如果需要在运行时移动或重新配置一组 2D 碰撞体,则将这些碰撞体全部设为一个标记为 Static 的父 2D 刚体的子代会比单独移动每个游戏对象更快。

注意:如上所述,Static 2D 刚体设计为不移动,因此不会考虑相交的两个 Static 2D 刚体对象之间的碰撞。然而,如果 Static 2D 刚体和 Kinematic 2D 刚体的其中一个 2D 碰撞体设置为触发器,两者就会交互作用

注意:BodyType不要在运行时去修改,参考文章https://blog.csdn.net/serenahaven/article/details/78851089

  • 【Simulated】

控制启用/禁用 2D刚体 2D物理模拟系统 之间的交互。(*2D刚体以及其附加的2D Colliders和2D关节)。使用它,比直接启用/禁用Collider2D组件和Joint2D组件更有效率——在内存和处理器方面。

开启/禁用模拟。包括

  • 物理模拟系统控制的运动(重力、作用力)
  • Collider2D的碰撞
  • Joint2D的约束效果
  • 2D 刚体、2D 碰撞体和 2D 关节的所有内部物理对象 stay in /are left in memory

为什么取消选中 Simulated 比单个组件控制更高效?

在 2D 物理模拟中,2D 刚体会控制附加的 Collider2D 的位置和旋转,并允许 2D 关节组件将这些位置和旋转用作锚点。Collider2D 会随着附加的 2D 刚体的移动而移动。然后,Collider2D 会计算与附加到其他 2D 刚体的其他 Collider2D 的触点。2D 关节还会约束 2D 刚体的位置和旋转。所有这些操作都会耗费模拟时间。

可通过单独启用/禁用组件来停止/启动 2D 物理模拟的各个元素,在 Collider2D 和 2D 关节组件上都可以执行此操作。但是,启用和禁用各个元素会带来内存使用和处理器处理成本。禁用Simulated时,2D 物理引擎不会生成需要模拟的基于物理的任何内部对象。启用Simulated时,2D 物理引擎会生成需要模拟的基于物理的内部对象。启用和禁用 2D 物理模拟组件意味着必须创建和销毁内部游戏对象和基于物理的内部组件;禁用Simulated比禁用单个组件更容易、更高效。

注意:取消选中 2D 刚体的 Simulated 选项时,附加的所有 2D 碰撞体都会有效“隐形”,即:无法被任何物理查询(例如 Physics.Raycast)检测到。

  • 【Collision Detection】

Discrete(离散):

        默认选项。关闭刚体的持续碰撞检测,仅会在新位置生成碰撞触点。 游戏对象在物理更新期间可能会重叠或穿过彼此(如果移动得足够快)。

Continuous(连续):

        确保在Rigidbody2D移动时检测到所有碰撞。具有 2D 刚体和 2D 碰撞体的游戏对象在更新期间不会穿过彼此。相反,Unity 会计算 2D 碰撞体的第一个影响点,并将游戏对象移动到该点。请注意,此设置比 Discrete 耗费更多 CPU 时间。

  • 【Gravity Scale】

重力。改为0将不受重力下坠影响。

  • 【Sleeping Mode】

定义GameObject如何“睡眠”以节省CPU在静止时的时间。

Never Sleep

Sleeping is disabled (this should be avoided where possible, as it can impact system resources).

禁止睡眠(应尽可能避免这样做,因为它会影响系统资源)

Start Awake

GameObject is initially awake.

GameObject最初是唤醒的。

Start Asleep

GameObject is initially asleep but can be woken by collisions.

GameObject最初处于睡眠状态,但可以通过碰撞唤醒。

  • 【Interpolate

插值:定义如何在物理更新之中插入GameObject的移动(当运动趋于不稳定时很有用)

        None不应用平滑移动。
        Interpolate

基于GameObject之前帧的位置,进行平滑移动差值。

        Extrapolate

基于GameObject在下一帧中的位置估计,进行平滑移动差值。

  • 【Constraints】

定义刚体运动的约束。

冻结位置可选,停止刚体在世界坐标X和Y轴上移动。
冻结旋转可选,停止刚体绕Z轴旋转。

脚本调用

参见https://www.cnblogs.com/qq2351194611/archive/2004/01/13/11911559.html

ProjectSettings-Physics2D

手册https://docs.unity3d.com/Manual/class-Physics2DManager.html 

Gravity重力Set the amount of gravity applied to all Rigidbody 2D GameObjects. Generally, you only set gravity for the negative direction of the y-axis.

设置应用于所有Rigidbody 2D的重力 游戏对象

通常,仅将重力设置为y轴的负方向。

Default Material默认材质Set a reference to the Physics Material 2D
 to use if none has been assigned to an individual Collider
 2D.
设置要使用的  Physics Material 2D
 如果没有指定特定的2D碰撞器
Velocity Iterations速度迭代Set the number of iterations made by the physics engine
 to resolve velocity effects. Higher numbers result in more accurate physics but at the cost of CPU time.
设置由物理引擎为解决速度影响而进行的迭代次数。较高的数字会导致更精确的物理效果,但会占用CPU时间。
Position Iterations位置迭代Set the number of iterations made by the physics engine to resolve position changes. Higher numbers result in more accurate physics but at the cost of CPU time.设置由物理引擎为解决位置变化而进行的迭代次数。较高的数字会导致更精确的物理效果,但会占用CPU时间。
Velocity Threshold速度阈值Set the threshold for elastic collisions. Unity treats collisions with a relative velocity lower than this value as inelastic collisions (that is, the colliding GameObjects do not bounce off each other).设置弹性碰撞的阈值。Unity对待碰撞与相对速度低于此值作为非弹性碰撞(即,碰撞GameObjects不相互弹开时)。
Max Linear Correction线性矫正最大值Set the maximum linear position correction used when solving constraints (from a range between 0.0001 to 1000000). This helps to prevent overshooting.设置求解约束时使用的最大线性位置校正(范围为0.0001至1000000)。这有助于防止过冲。
Max Angular Correction角度矫正最大值Set the maximum angular correction used when solving constraints (from a range between 0.0001 to 1000000). This helps to prevent overshooting.设置求解约束时使用的最大角度校正(范围为0.0001至1000000)。这有助于防止过冲。
Max Translation Speed最大移动速度Set the maximum linear speed of a Rigidbody
 2D GameObject during any physics update.
设置使用2D刚体的GameObject在物理更新中线性速度的最大值
Max Rotation Speed最大旋转速度Set the maximum rotation speed of a Rigidbody 2D GameObject during any physics update.设置使用2D刚体的GameObject在物理更新中旋转速度的最大值
Baumgarte ScaleSet the scale factor that determines how fast Unity resolves collision overlaps.设置比例因子,该比例因子确定Unity解决碰撞重叠的速度。
Baumgarte Time of Impact ScaleSet the scale factor that determines how fast Unity resolves time-of-impact overlaps.设置比例因子,该比例因子确定Unity解决碰撞时间重叠的速度。
Time to Sleep进入睡眠的时间值The time (in seconds) that must pass after a Rigidbody 2D stops moving before it goes to sleep.2D刚体停止移动后,到进入睡眠之前所必须经过的时间(秒)。
Linear Sleep Tolerance线性睡眠容差Set the linear speed below which a Rigidbody 2D goes to sleep after the Time to Sleep elapses.经过“Time to Sleep”的时间后,当2D刚体线性速度低于该值,刚体进入睡眠。
Angular Sleep Tolerance角度睡眠容差Set the rotational speed below which a Rigidbody 2D goes to sleep after Time to Sleep elapses.经过“Time to Sleep”的时间后,当2D刚体旋转速度低于该值,刚体进入睡眠。
Default Contact Offset默认接触(距离)偏移值Set a proximity distance value for colliders to be considered in contact, even they are not actually in contact. Colliders whose distance is less than the sum of their contactOffset values generate contacts. This allows the collision detection system to predictively enforce the contact constraint even when the objects are slightly separated.
Caution: Reducing this value too far could cripple Unity’s ability to calculate continuous polygon collisions. Conversely, increasing the value too much could create artifacts for vertex collision.
为被视为接触的对撞机设置接近距离值,即使它们实际上没有接触。距离小于其contactOffset值之和的碰撞器会生成接触。这使碰撞检测系统可以预测性地强制执行接触约束,即使物体稍微分离也是如此。
注意:将该值减小得太多可能会削弱Unity计算连续多边形碰撞的能力。相反,过多增加该值可能会导致顶点碰撞的假象。
Auto Simulation自动模拟Enable this option to automatically run the physics simulation or allow explicit control of it.启用此选项可自动运行物理模拟或允许对其进行显式控制。
Queries Hit Triggers触发器命中查询Enable this option if you want Collider 2Ds marked as Triggers to return a hit when any physics query (such as Linecasts or Raycasts) intersects with them. Defaults to enabled.如果要让标记为isTriggerCollider 2D在任何物理查询(例如“线”或“射线”)与它们相交时返回命中,请启用此选项。默认为启用。
Queries Start In CollidersEnable this option if you want physics queries that start inside a Collider 2D to detect the collider they start in.如果要在Collider 2D内部开始的物理查询检测它们开始的碰撞机,请启用此选项。
Callbacks On DisableEnable this option to produce collision callbacks when a collider with contacts is disabled.
Auto Sync Transforms自动同步转换Enable this option to automatically sync transform changes with the physics system.启用此选项可自动将变换更改与物理系统同步。
Layer Collision Matrix图层碰撞阵列表Define how the layer-based collision detection system behaves. Select which layers on the Collision Matrix interact with the other layers by checking them.定义基于层的碰撞检测系统的行为。通过检查来选择“碰撞矩阵”上的哪些层与其他层进行交互。

  • 3
    点赞
  • 9
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

煮粥侠_99

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值