103人参与 • 2024-08-06 • unity
rigidbody类的功能是用来模拟gameobject对象在现实世界中的物体特性,包括重力、阻力、质量、速度等
在rigidbody类中,涉及的实例属性有collisiondetectionmode、drag、inertiatensor、mass和velocity。
基本语法
public collisiondetectionmode collisiondetectionmode{ get; set; }
功能说明
此属性用于设置刚体的碰撞检测模式。刚体的碰撞检测模式有三种,即枚举类型collisiondetectionmode
功能说明
1、discrete :静态离散检测模式,为系统的默认设置。在此模式下,只有在某一帧中两物体的碰撞器发生重叠时才能被检测到,这样就有可能导致某物体的前一帧在另一个刚体的上方,而下一帧移动到了另一个刚体的下方,这样就会发生穿越现象。
2、continuous:静态连续检测模式,一般用在高速运动刚体的目标碰撞体上,防止被穿越,检测强度比discreet强。
总之,无论哪种检测模式都有可能被穿越,为了防止穿越现象的发生,除了设置其碰撞检测模式外,还要适当增加两物体碰撞器的厚度,一般不要小于0.1,,同时尽量降低两物体碰撞时的相对速度。
基本语法
public float drag { get; set; }
功能说明
此属性用于给刚体添加一个阻力。drag值越大刚体速度减慢得越快,当drag>0时,刚体在增加到一定速度后会均速移动
注意:刚体在自由落体运动中的最大速度值只与gravity和drag值有关,与质量mass无关。
功能说明
此属性用于设置刚体的惯性张量。在距离重心同等的条件下,刚体会向张量值大的一遍倾斜。
基本语法
public float mass{ get; set;}
功能说明
此属性用于设置或返回刚体的质量。一般刚体质量取值在0.1附近模拟最佳,最大不要超过10,否则容易出现模拟不稳定的情况
mass的主要作用是在物体发生碰撞时计算碰撞后物体的速度。当一个物体分别去撞击mass大的物体和mass小的物体时,根据动量守恒定律,较重的物体被撞后的速度要慢于较轻的物体
基本语法
public vector3 velocity{ get; set; }
功能说明
此属性用于设置或返回刚体的速度值
1、在脚本中无论是给刚体赋予一个vector3类型的速度向量v,还是获取当前刚体的速度v,v的方向都是相对世界坐标系而言的。
2、velocity的单位是米每秒,而不是帧每秒,其中米是unity中默认的长度单位。
在rigidbody类中涉及的实例方法:addexplosionforce方法、addforceatposition方法、addtoque方法、closestpointonbounds方法、getpointvelocity方法、moveposition方法、sleep方法、sweeptest方法、sweeptestall方法和wakeup方法。
基本语法
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。
功能说明
此方法用于对刚体添加一个模拟爆炸效果的作用力。
基本语法
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、当力的作用点不在刚体重心时,由于作用点的扭矩会使刚体发生旋转,但是,当作用力的方向经过刚体的重心坐标时不发生旋转。
基本语法
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。
基本语法
public vector3 closestpointonbounds(vector3 position);
其中参数position为爆炸点坐标
功能说明
此方法用于求爆炸点到刚体collider表面的作用点。
基本语法
public vector3 getpointvelocity(vector3 worldpoint);
其中参数worldpoint为世界坐标系中的点坐标
功能说明
此方法用于获取世界坐标系中worldpoint点在刚体局部坐标系中的速度。
基本语法
public vector3 getrelativepointvelocity(vector3 relativepoint);
其中参数relativepoint为刚体自身坐标系中的点坐标。
功能说明
此方法用于获取刚体自身坐标系中relativepoint点的速度,速度的计算会受刚体角速度的影响。
基本语法
public void moveposition(vector3 position);
其中参数position为刚体组件要移动到的位置坐标
功能说明
此方法用于对刚体的位置进行移动,通常用在刚体失去动力学模拟的情况下,即iskinematic为true时。
基本语法
public void sleep()
功能说明
此方法可使刚体进行休眠状态,且至少休眠一帧
基本语法
1、public bool sweeptest(vector3 direction ,out raycasthit hitinfo);
2、public bool sweeptest(vector3 direction ,out raycasthit hitinfo ,float distance);
功能说明
此方法用于检测在刚体的direction方向是否有碰撞器对象,且对象的有效探测距离不大于distance。
基本语法
public raycasthit[] sweeptestall(vector3 direction);
public raycasthit[] sweeptestall(vector3 direction ,float distance);
其中参数direction为探测方向,参数distance为有效探测距离
功能说明
此方法用于探测刚体的direction放心的distance距离内是否含有碰撞器,并返回所有探测到的物体的raycasthit。
基本语法
public void wakeup();
功能说明
此方法用于将刚体从休眠状态唤醒。
1、其他刚体与休眠中的刚体发生了碰撞;
2、使用关节连接的其他刚体发生了移动;
3、刚体的属性发生了改变;
4、给休眠中的刚体施加了一个外力
功能区别
1、usegravity属性用来确定刚体是否接受重力加速度的感应
2、iskinematic属性用来确定刚体是否接受动力学模拟,此影响不仅包括重力感应,还包括速度、阻力、质量等的物理模拟
在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为枚举类型,用来控制力的作用方式
1、forcemode.force:默认方式,使用刚体的质量计算,以每帧间隔时间为单位计算动量。
2、forcemode.acceleration:在此中作用方式下,会忽略刚体的实际质量而采用默认值1.0f,时间间隔以系统帧频间隔计算
3、forcemode.impulse:此方式采用瞬间力作用方式,即把t的值默认为1,不再采用系统的帧频间隔
4、forcemode.velocitychange:此种作用方式下将忽略刚体的实际质量,采用默认质量1.0,同时也忽略系统的实际帧频间隔,采用默认间隔1.0
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刚分离时被调用,且只被调用一次。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论