首页 > 代码库 > 《Unity_API解析》 第十章 Rigidbody类

《Unity_API解析》 第十章 Rigidbody类

Rigidbody类的功能是用来模拟GameObject对象在现实世界中的物理特性,包括重力、阻力、质量、速度等。对Rigidbody对象属性的赋值代码通常放在脚本中的OnFixedUpdate方法中。

 

Rigidbody类实例属性

collisionDetectionMode属性:碰撞检测模式

public CollisionDetectionMode collisionDetectionMode{get; set;}

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

Discrete:静态离散检测模式,系统默认设置。此模式下,只有在某一帧中两物体的碰撞器发生重叠时才能被检测到,这样可能会发生穿越现象。

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

ContinuousDynamic:最强的连续动态监测模式,一般用在两个高速运动的物体上,防止互相穿越,其计算消耗最大,一般情况慎用。

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

 

drag属性:刚体阻力

public float drag{get; set;}

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

 

inertiaTensor属性:惯性张量

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

 

mass属性:刚体质量

public float mass{get; set;}

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

 

velocity属性:刚体速度

public Vector3 velocity{get; set;}

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

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

velocity的单位是米每秒。米是Unity中默认的长度单位。

 

Rigidbody类实例方法

AddExplosionForce方法,模拟爆炸力

public void AddExplosionForce(float explosionForce, Vector3 explosionPosition, float explosionRaduce);

public void AddExplosionForce(float explosionForce, Vector3 explosionPosition, float explosionRaduce, float upwardsModifier);

public void AddExplosionForce(float explosionForce, Vector3 explosionPosition, float explosionRaduce, float upwardsModifier, ForceMode mode);

参数explosionForce为爆炸点增加的力的大小,参数explosionPosition为爆炸点坐标(相对世界坐标系),参数explosionRadius为爆炸作用力有效半径,参数upwardsModifier为爆炸力作用点在y轴方向上的偏移,参数mode为爆炸力的作用模式,默认为ForceMode.force。

 

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

public void AddForceAtPostion(Vector3 force, Vector3 position);

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

参数force为扭矩向量,参数position为作用点坐标值,参数mode为力的作用方式。

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

 

AddTorque方法:刚体添加扭矩

public void AddTorque(Vector3 torque);

public void AddTorque(Vector3 torque, ForceMode mode);

 

public void AddTorque(float x, float y, float z);

public void AddTorque(float x, float y, float z, ForceMode mode);

参数torque为扭矩向量,参数mode为力的作用方式。

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

 

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

public Vector3 ClosestPointOnBounds(Vector3 position);

 

GetPointVelocity方法:刚体点速度

public Vector3 GetPointVelocity(Vector3 worldPoint);

其中参数worldPoint为世界坐标系的点坐标。

此方法用于获取世界坐标系中worldPoint点在刚体局部坐标系中的速度,速度的计算会受刚体角速度的影响。

 

GetRelativePointVelocity方法:刚体点相对速度

public Vector3 GetRelativePointVelocity(Vector3 relativePoint);

参数为刚体自身坐标系中的点坐标。

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

 

MovePosition方法:刚体位置移动

public void MovePosition(Vector3 position);

其中参数为刚体组件要移动到的位置坐标。

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

类似方法有MoveRotation。

 

Sleep方法:刚体休眠

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

 

WakeUp方法:唤醒刚体

public void WakeUp();

此方法用于将刚体从休眠状态唤醒。要将刚体从休眠状态唤醒,除了调用WakeUp方法外,还有发生以下4种情况时。

其他刚体与休眠的刚体发生了碰撞。

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

刚体的属性发生了改变。

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

 

SweepTest方法:探测碰撞器。

public bool SweepTest(Vector3 direction, out RaycastHit hitInfo);

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

参数direction为探测方向,参数distance为有效探测距离,默认为无穷大。

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

 

SweepTestAll方法:探测碰撞器

public RaycastHit[] SweepTestAll(Vector3 dorection);

public RaycastHit[] SweepTestAll(Vector3 dorection, float distance);

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

 

注解:

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

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

 

在Rigidbody类中,mass、density和scale3个API之间关系紧密。

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

若在脚本中使用Rigidbody,SetDensity(density:float)方法设置了刚体的密度,则刚体的质量为mass = density * scale.x * scale.y * scale.z,而与Inspector面板中Mass的设置大小无关。

若在脚本中既设置了密度Density,又设置了质量mass,则刚体世纪质量值要看脚本中代码执行的前后次序,后者有效。

当两物体发生碰撞时,遵循动量守恒定力,即m1 * v1 + m2 * v2 = (m1 + m2) * v。

 

ForceMode为枚举类型,用来控制力的作用方式,有4个枚举成员。

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

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

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

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

 

《Unity_API解析》 第十章 Rigidbody类