it编程 > 游戏开发 > unity

UnityAPI的学习——Rigidbody类

103人参与 2024-08-06 unity

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方法:模拟爆炸力

基本语法

1public void addexplosionforce(float explosionforce ,vector3 explosionposition , float explosionradius);
2public void addexplosionforce(float explosionforce ,vector3 explosionposition ,float explosionradius,float upwardsmodifier);
3public void addexplosionforce(float explosionforce ,vector3 explosionposition ,float explosionradius,float upwardsmodifier,forcemode mode);
其中参数explosionforce为爆炸点施加的力的大小,参数explosionposition为爆炸点坐标(相对世界坐标系),参数explosionradius为爆炸作用力有效半径,参数upwardsmodifier为爆炸力作用点在y轴方向上的偏移,参数mode为爆炸力的作用模式,默认为forcemode.force。

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

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

基本语法

1public void addforceatposition(vector3 force ,vector3 position);
2public void addforceatposition(vector3 force ,vector3 position ,forcemode mode);

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

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

addtorque方法:刚体添加扭矩

基本语法

1public void addtorque(vector3 torque);
2public void addtorque(vector3 torque ,forcemode mode);
3public void addtorque(float x , float y ,float z);
4public 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方法:检测碰撞器

基本语法

1public bool sweeptest(vector3 direction ,out raycasthit hitinfo);
2public 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刚分离时被调用,且只被调用一次。

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Unity利用ZXing库 生成和识别二维码

08-06

Unity_角色移动_Translate

08-06

Unity怎么通过WIFI连接真机调试

08-06

Unity3D教程

08-06

Unity 制作简单的轮播图

08-06

【Unity实现背包拖拽功能 】

08-06

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论