首页 > 代码库 > 《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类