UnityAPI的学习——Rigidbody类

小明 2025-04-28 17:46:39 3

Rigidbody类的功能是用来模拟GameObject对象在现实世界中的物体特性,包括重力、阻力、质量、速度等

()

Rigidbody类实例属性

在Rigidbody类中,涉及的实例属性有collisionDetectionMode、drag、inertiaTensor、mass和velocity。

collisionDetectionMode属性:碰撞检测模式

基本语法

()
public CollisionDetectionMode collisionDetectionMode{ get; set; }

功能说明

此属性用于设置刚体的碰撞检测模式。刚体的碰撞检测模式有三种,即枚举类型CollisionDetectionMode

功能说明

1、Discrete :静态离散检测模式,为系统的默认设置。在此模式下,只有在某一帧中两物体的碰撞器发生重叠时才能被检测到,这样就有可能导致某物体的前一帧在另一个刚体的上方,而下一帧移动到了另一个刚体的下方,这样就会发生穿越现象。

2、Continuous:静态连续检测模式,一般用在高速运动刚体的目标碰撞体上,防止被穿越,检测强度比Discreet强。

总之,无论哪种检测模式都有可能被穿越,为了防止穿越现象的发生,除了设置其碰撞检测模式外,还要适当增加两物体碰撞器的厚度,一般不要小于0.1,,同时尽量降低两物体碰撞时的相对速度。

drag属性:刚体阻力

基本语法

public float drag { get; set; }

功能说明

此属性用于给刚体添加一个阻力。drag值越大刚体速度减慢得越快,当drag>0时,刚体在增加到一定速度后会均速移动

注意:刚体在自由落体运动中的最大速度值只与Gravity和drag值有关,与质量Mass无关。

inertiaTensor属性:惯性张量

功能说明

此属性用于设置刚体的惯性张量。在距离重心同等的条件下,刚体会向张量值大的一遍倾斜。

msaa属性:刚体质量

基本语法

public float mass{	get;	set;}

功能说明

此属性用于设置或返回刚体的质量。一般刚体质量取值在0.1附近模拟最佳,最大不要超过10,否则容易出现模拟不稳定的情况

mass的主要作用是在物体发生碰撞时计算碰撞后物体的速度。当一个物体分别去撞击mass大的物体和mass小的物体时,根据动量守恒定律,较重的物体被撞后的速度要慢于较轻的物体

velocity属性:刚体速度

基本语法

public Vector3 velocity{ get; set; }

功能说明

此属性用于设置或返回刚体的速度值

1、在脚本中无论是给刚体赋予一个Vector3类型的速度向量v,还是获取当前刚体的速度v,v的方向都是相对世界坐标系而言的。

2、velocity的单位是米每秒,而不是帧每秒,其中米是Unity中默认的长度单位。

Rigidbody类实例

在Rigidbody类中涉及的实例方法:AddExplosionForce方法、AddForceAtPosition方法、AddToque方法、ClosestPointOnBounds方法、GetPointVelocity方法、MovePosition方法、Sleep方法、SweepTest方法、SweepTestAll方法和WakeUp方法。

AddExplosionForce方法:模拟爆炸力

基本语法

1、public void AddExplosionForce(float explosionForce ,Vector3 explosionPosition , float explosionRadius);
2、public void AddExplosionForce(float explosionForce ,Vector3 explosionPosition ,float explosionRadius,float upwardsModifier);
3、public void AddExplosionForce(float explosionForce ,Vector3 explosionPosition ,float explosionRadius,float upwardsModifier,ForceMode mode);
其中参数explosionForce为爆炸点施加的力的大小,参数explosionPosition为爆炸点坐标(相对世界坐标系),参数explosionRadius为爆炸作用力有效半径,参数upwardsModifier为爆炸力作用点在y轴方向上的偏移,参数mode为爆炸力的作用模式,默认为ForceMode.Force。

功能说明

此方法用于对刚体添加一个模拟爆炸效果的作用力。

AddForceAtPosition方法:增加刚体点作用力

基本语法

1、public void AddForceAtPosition(Vector3 force ,Vector3 position);
2、public void AddForceAtPosition(Vector3 force ,Vector3 position ,ForceMode mode);

功能说明

从方法用于为参数position点增加一个力force,其参考坐标系为世界坐标系,作用方式为mode,默认值为ForceMode.Force。

1、当力的作用点在刚体重心时,刚体不发生旋转

2、当力的作用点不在刚体重心时,由于作用点的扭矩会使刚体发生旋转,但是,当作用力的方向经过刚体的重心坐标时不发生旋转。

AddTorque方法:刚体添加扭矩

基本语法

1、public void AddTorque(Vector3 torque);
2、public void AddTorque(Vector3 torque ,ForceMode mode);
3、public void AddTorque(float x , float y ,float z);
4、public void AddTorque(float x , float y ,float z,ForceMode mode);
其中参数torque为扭矩向量,参数mode为力的作用方式。

功能说明

此方法用于给刚体添加一个扭矩torque,扭矩的作用力方式由mode决定,默认为ForceMode.Force。

ClosestPointOnBounds方法:爆炸点到刚体最短距离

基本语法

public Vector3 ClosestPointOnBounds(Vector3 position);
其中参数position为爆炸点坐标

功能说明

此方法用于求爆炸点到刚体Collider表面的作用点。

GetPointVelocity方法:刚体点速度

基本语法

public Vector3 GetPointVelocity(Vector3 worldPoint);
其中参数worldPoint为世界坐标系中的点坐标

功能说明

此方法用于获取世界坐标系中worldPoint点在刚体局部坐标系中的速度。

GetRelativePointVelocity方法:刚体点相对速度

基本语法

public Vector3 GetRelativePointVelocity(Vector3 relativePoint);
其中参数relativePoint为刚体自身坐标系中的点坐标。

功能说明

此方法用于获取刚体自身坐标系中relativePoint点的速度,速度的计算会受刚体角速度的影响。

MovePosition方法:刚体位置移动

基本语法

public void MovePosition(Vector3 position);
其中参数position为刚体组件要移动到的位置坐标

功能说明

此方法用于对刚体的位置进行移动,通常用在刚体失去动力学模拟的情况下,即isKinematic为true时。

Sleep方法:刚体休眠

基本语法

public void Sleep()

功能说明

此方法可使刚体进行休眠状态,且至少休眠一帧

SweepTest方法:检测碰撞器

基本语法

1、public bool SweepTest(Vector3 direction ,out RaycastHit hitInfo);
2、public bool SweepTest(Vector3 direction ,out RaycastHit hitInfo ,float distance);

功能说明

此方法用于检测在刚体的direction方向是否有碰撞器对象,且对象的有效探测距离不大于distance。

SweepTestAll方法:探测碰测器

基本语法

public RaycastHit[] SweepTestAll(Vector3 direction);
public RaycastHit[] SweepTestAll(Vector3 direction ,float distance);
其中参数direction为探测方向,参数distance为有效探测距离

功能说明

此方法用于探测刚体的direction放心的distance距离内是否含有碰撞器,并返回所有探测到的物体的RaycastHit。

WakeUp方法:唤醒刚体

基本语法

public void WakeUp();

功能说明

此方法用于将刚体从休眠状态唤醒。

1、其他刚体与休眠中的刚体发生了碰撞;

2、使用关节连接的其他刚体发生了移动;

3、刚体的属性发生了改变;

4、给休眠中的刚体施加了一个外力

关于useGravity、isKinematic和velocity的使用

功能区别

1、useGravity属性用来确定刚体是否接受重力加速度的感应

2、isKinematic属性用来确定刚体是否接受动力学模拟,此影响不仅包括重力感应,还包括速度、阻力、质量等的物理模拟

关于Rigidbody中mass、density及scale之间的关系

在Rigidbody类中,mass、density和scale这3个API之间有着较为紧密的联系

1、若在脚本中未使用Rigidbody.SetDensity(density :float)方法设置刚体的密度,则刚体的质量mass值为在Inspector面板中Mass的大小,此时mass与Transform中的scale大小无关。

2、若在脚本中使用Rigidbody.SetDensity(density : float)方法设置了刚体的密度。

3、若在脚本中既设置了密度Density,又设置了质量mass,则刚体实际质量要看脚本中代码执行的

4、当两物体发生碰撞时遵循动量守护定理

关于作用力方式ForceMode的功能

ForceMode为枚举类型,用来控制力的作用方式

1、ForceMode.Force:默认方式,使用刚体的质量计算,以每帧间隔时间为单位计算动量。

2、ForceMode.Acceleration:在此中作用方式下,会忽略刚体的实际质量而采用默认值1.0f,时间间隔以系统帧频间隔计算

3、ForceMode.Impulse:此方式采用瞬间力作用方式,即把t的值默认为1,不再采用系统的帧频间隔

4、ForceMode.VelocityChange:此种作用方式下将忽略刚体的实际质量,采用默认质量1.0,同时也忽略系统的实际帧频间隔,采用默认间隔1.0

关于OnTriggerXXX和OnCollisionXXX的功能

OnTriggerXXX指的是OnTriggerEnter、OnTriggerExit和OnTriggerStay这3个消息。

它们都是用来处理不同物体在不同状态下消息的反馈,两个物体A与B,当A物体向B物体移动,B物体处于静止。

1、若A无Rigidbody组件,则B中无论含有Rigidbody组件,A物体都将穿越B物体,并且A和B脚本中的OnTrigger方法和OnCollision方法都不会被调用。

2、若A中含有Rigidbody组件,则B中无论是否还有Rigidbody组件,只要B中含有Collider类组件,A和B脚本中的OnTrigger方法或OnCollision方法就会被调用,到底调用哪一种静态方法要看A和B物体中Collider类组件中的IsTrigger是否被选中。

3、若A中含有Rigidbody组件,B中含有Collider类组件,当A和B物体中Collider类组件的IsTrigger都没有选中时,A和B脚本中OnCollision类的方法就会被调用,而OnTrigger静态方法则不会被调用。

4、若A中含有Rigidbody组件,B中含有Collider类组件,当A和B物体中的Collider类组件的IsTrigger至少有一个被选中时,A和B物体脚本中的OnTrigger静态方法会被调用,而OnCollision静态方法不会被调用

5、当符合OnCollision静态方法激活条件时,A不可穿越B物体,A会与B发生弹性碰撞

6、当符号OnTrigger静态方法激活条件时,A会穿越B物体,即A、B物体的运动行为互不影响,只是反馈了两个物体的接触状态:未接触、开始接触、接触中、互相分离。

7、OnTriggerEnter或OnCollisionEnter方法会在A刚开始接触B时被调用,且在A、B分离前只会调用一次

8、OnTriggerStay或OnCollisionStay方法会在A和B保持接触状态时被调用,且在A、B分离前每帧都会被调用

9、OnTriggerExit或OnCollisionExit方法会在A、B刚分离时被调用,且只被调用一次。

The End
微信