A. (六)Unity3D物理引擎组件汇总
首先要熟悉一些基本的力学名词及相关公式
刚体(Rigidbody) :刚体是指在运动中和受到力的作用后,形状和大小不变,而且内部各点的相对位置不变的物体。绝对刚体实际上是不存在的,刚体是力学中的一个科学抽象概念,即理想模型。
力(F) :力是物体对物体的作用,力不能脱离物体而单独存在。Unity的物理引擎就是以此为基础构建的。
重力(G) :物体由于地球的吸引而受到的力叫重力。重力的施力物体是地心。Unity中的重力与其相似。重力的方向总是竖直向下。
摩擦力 :在Unity中分为滑动摩擦力和静摩擦力。通常通过设置动摩擦系数和静摩擦系数来控制物体的运动。(滚动摩擦一般不用)
弹力 :在Unity中物体受外力后产生与其相反方向的力。通常通过设置弹性系数来
使物体获得弹性属性。
扭矩力 :使物体发生转动的力。
阻尼 :当物体受到外力作用而振动时,会产生一种使外力衰减的反力,称为阻尼力(或减震力) 。
重力加速度 (单位:m/s^2): g = 9.81 (在Unity中)
重力 (单位:N): G = mg ***
滑动摩擦力 (单位:N): F = μ×FN (FN:正压力,μ:动摩擦因数)
单摆周期公式 (单位:s): T = 2π√(L/g)***(L:摆长)
力矩 (单位:N×m): M = FL (L:摆动轴)
物体要受力的影响就需要添加Rigibody组件。(基本上能动的物体都需要Rigibody组件)物体添加Rigibody组件后,可以接受外力和扭矩力,并一直受到重力影响,
选中一个物体后,为其添加Rigibody组件。
Mass(质量) :用于设置游戏对象的质量。(一般在同一游戏场景中,游戏对象之间的质量差不大于100倍)
Drag(阻力) :即游戏对象受力运动时受到的空气阻力,阻力极大时,游戏对象会立即停止运动。
Angular Drag(角阻力) :即游戏对象受扭矩力旋转时受到的空气阻力。同样的,阻力极大时,游戏对象会立即停止旋转。
Use Gravity(使用重力) :即开启此项时,游戏对象会受到重力的影响。
Is Kinematic(是否开启动力学) :即开启此项时,游戏对象将不再受到物理引擎的影响,从而只能通过Transform属性来对其操作。(该方式适用于模拟平台的移动或带有铰链关节链接刚体的动画)
Interpolate(插值) :用于控制刚体运动的抖动情况。
None:没有插值。
Interpolate:内插值。基于前一帧的Transform平滑此次的Transform。
Extrapolate:外插值。基于下一帧的Transform平滑此次的Transform。
Collision Detection(碰撞检测) :该属性用于控制避免高速运动的游戏对象穿过其它对象而未发生碰撞。
Discrete:离散碰撞检测。该模式与场景中其它的所有碰撞体进行碰撞检测。该值为默认值。
Continuous:连续碰撞检测。该模式用于检测与动态碰撞体(带有Rigidbody)碰撞,使用连续碰撞检测模式来检测与网格碰撞体的(不带Rigidbody)碰撞。其它的刚体会采用离散碰撞模式。此模式适用于那些需要采用连续动态碰撞检测的对象相碰撞的对象。这对物理性能会有很大的影响,如果不需要对快速运动的对象进行碰撞检测,不建议使用此模式,建议使用离散碰撞检测模式。
Continuous Dynamic:连续动态碰撞检测。该模式用于检测与采用连续碰撞模式或连续动态碰撞模式对象的碰撞,也可以用于检测没有Rigidbody的静态网格碰撞体。对于与之碰撞的其它对象可采用离散碰撞检测。该模式也可以用于检测快速运动的游戏对象。
Constraints(约束) :该项用于控制对于刚体运动的约束。
Freeze Position:冻结位置。刚体对象在世界坐标系中的x,y,z轴方向上(选中状态)的移动将无效。
Freeze Rotation:冻结旋转。刚体对象在世界坐标系中的x,y,z轴方向上(选中状态)的旋转将无效。
Constant Force用来为刚体添加恒力。适用于类似火箭发射的对象,因为F=ma,使得这类对象的速度不断提升。
选中一个物体后,为其添加Constant Force组件。
四种属性均用三维向量表示,坐标轴表示方向,数值表示大小。
需要注意的是:添加恒力(Constant Force)组件时,系统会默认添加刚体(Rigidbody)组件。
添加恒力组件后,不能移除刚体组件。
Force(力) :设置世界坐标系中使用的扭矩力。
Relative Force(相对力) :设置在物体局部坐标系中使用的力。
Torque(扭矩) :设置在世界坐标系中使用的扭矩力。游戏对象依据该向量进行转动。(向量越长转动越快)
Relative Torque(相对扭矩) :相对扭矩。设置在物体局部坐标系中使用的扭矩力。。游戏对象依据该向量进行转动。(向量越长转动越快)
Character Controller主要用于第三人称或第一人称游戏主角的控制。不使用刚体物理效果。(Character Controller可通过物理效果影响其他的对象,但无法通过物理效果被其他的对象影响)
选中一个物体后,为其添加Character Controller组件。
Slope Limit(坡度限制) :设置所控制的游戏对象只能爬上角度小于或等于该参数值的斜坡倾角。
Step Offset(台阶高度) :设置所控制的游戏对象可以迈上的最高台阶的高度。
Skin Width(皮肤厚度) :该参数决定了两个碰撞体可以相互参入的深度。
较大的参数值会产生抖动的现象,较小的参数值会导致所控制的游戏对象被卡住,较为合理的设置是该参数值为Radius值的10%。
Min Move Distance(最小移动距离) :如果所控制的游戏对象的移动距离小于该值,则游戏对象将不会移动,这样可避免抖动,大多数情况下将该值设为0。
Center(中心) :该参数决定了胶囊碰撞体与所控制的游戏对象的相对位置,并不影响所控制的角色对象的中心坐标
Radius(半径) :胶囊体碰撞的长度半径,同时该项也决定了碰撞体的半径。
Height(高度) :用于设置所控制的角色对象的胶囊体碰撞体的高度。
Collider要与Rigibody一起添加到游戏对象上才能触发碰撞。
两个刚体撞在一起时,拥有碰撞体的对象才会计算碰撞。
都没有碰撞体的两个刚体会彼此穿过,不会发生碰撞。
添加Collider组件方法
一般创建一个游戏对象时会自动添加相应的碰撞体。
该碰撞体可调整为不同大小的长方体。
可用作门、墙、平台,也可用于布娃娃的角色躯干或汽车等交通工具的外壳上。
该碰撞体的三维大小可以均匀地调节,但不能单独调节某个坐标轴方向的大小。
可用作落石、球类等游戏对象。
该碰撞体的高度和半径可单独调节。
可用作角色控制器或与其他不规则形状的碰撞结合使用。(Uinty中角色控制器中通常内嵌了胶囊碰撞体)
该碰撞体通过获取网格对象并在其基础上构建碰撞。
与在复杂的网络模型上使用基本碰撞体相比,网格碰撞体要更加精细,但会占用更多的系统资源。(开启Convex参数的网格碰撞体才可以与其他的网格碰撞体发生碰撞)
该碰撞体是基于地形构建的碰撞体。
车轮碰撞体是一种针对地面车辆的特殊碰撞体,它有内置的碰撞检测、车轮物理系统及有滑胎摩擦的参考体。
除了车轮,该碰撞体也可用于其他的游戏对象。
关节是模拟物体与物体之间的一种连接关系,关节必须依赖于刚体组件。
关节组件可以添加到多个游戏对象中,关节又分为3D类型的关节和2D类型的关节。(本篇讲述3D关节)
添加Joint组件方法
由两个刚体组成,使它们像被连接在一个铰链上那样运动。
它非常适用于对门的模拟,也可用作模型链及钟摆等物体。
需要注意的是:添加关节(Join)组件时,系统会默认添加刚体(Rigidbody)组件。
添加关节组件后,不能移除刚体组件。
Connected Body(连接刚体) :为关节指定要连接的刚体。(若不指定刚体,则该关节默认与世界相连)
Anchor(锚点) :刚体可围绕锚点进行摆动。该值应用于局部坐标系。
Axis(轴) :定义刚体摆动的方向。该值应用于局部坐标系。
Auto Configure Connected Anchor(自动设置连接锚点) :勾选该项,连接锚点会自动设置。(该项默认为开启状态)
Connected Anchor(连接锚点) :自动连接锚点项开启时,此项会自动设置。自动连接锚点项未开启时,可手动设置连接锚点。
Use Spring(使用弹簧) :勾选该项,弹簧会使刚体与其连接的主体形成一个特定的角度
Spring(弹簧) :当Use Spring参数开启时,此属性有效。
Spring:弹簧力。设置推动对象使其移动到相应位置的作用力。
Damper:阻尼。设置对象的阻尼值,数值越大则对象移动得越缓慢。
Target Position:目标角度。设置弹簧的目标角度,弹簧会拉向此角度。
Use Motor(使用发动机) :勾选该项,发动机会使对象发生旋转。
Motor(发动机) :当Use Motor参数开启时,此属性有效。
Target Velocity:目标速度。设置对象预期将要达到的速度值。
Force:作用力。设置为了达到目的速度而施加的作用力。
Free Spin:自动转动。勾选该项,则发动机永远不会停止,旋转只会越转越快。
Use Limits(使用限制) :勾选该项,铰链的角度将被限定在最大值和最小值之间。
Limits(限制) :当Use Limits参数开启时,此属性有效。
Min:最小值。设置铰链能达到的最小角度。
Max:最大值。设置铰链能达到的最大角度。
Min Bounce:最小反弹。设置当对象触到最小限制时的反弹值。
Max Bounce:最大反弹。设置当对象触到最大限制时的反弹值。
Contact Distance:接触距离。控制关节的抖动。
Break Force(断开力) :设置铰链关节断开的作用力。
Break Torque(断开转矩) :设置断开铰链关节所需的转矩。
Enable Collision(激活碰撞) :勾选该项,关节之间也会检测碰撞。
Enable Preprocessing(启用预处理) :勾选该项,实现关节的稳定。(该项默认为开启状态)
固定关节用于约束一个游戏对象对另一个游戏对象的运动。类似于对象的父子关系,但它是通过物理系统来实现而不像父子关系那样是通过Transform属性来进行约束。(使用固定关节的对象自身需要有一个刚体组件)
适用于当希望将对象较容易与另一个对象分开时,或者连接两个没有父子关系的对象使其一起运动时。
Connected Body (连接刚体) :用于指定关节要连接的刚体。(若不指定刚体,则该关节默认与世界相连)
Break Force(断开力) :设置关节断开的作用力。
Break Torque(断开转矩) :设置断开关节所需的转矩。
Enable Collision(激活碰撞) :勾选此项,则关节之间也会检测碰撞。
Enable Preprocessing(启用预处理) :勾选该项,实现关节的稳定。(该项默认为开启状态)
弹簧关节组件可将两个刚体连接在一起,使其像连接着弹簧那样运动。
Connected Body(连接刚体) :用于为弹簧指定要连接的刚体。(若不指定刚体,则该关节默认与世界相连)
Anchor(锚点) :设置Joint在对象局部坐标系中的位置。(注意:不是对象将弹向的点)
Auto Configure Connected Anchor(自动设置连接锚点) :勾选该项,连接锚点会自动设置。(该项默认为开启状态)
Connected Anchor(连接锚点) :自动连接锚点项开启时,此项会自动设置。自动连接锚点项未开启时,可手动设置连接锚点。
Spring(弹簧) :设置弹簧的强度,数值越高弹簧的强度就越大。
Damper(阻尼) :设置弹簧的阻尼系数,阻尼数值越大,弹簧强度减小的幅度越大。
Min Distance(最小距离) :设置弹簧启用的最小距离值。如果两个对象之间的当前距离与初始距离的差小于该值,则不会开启弹簧。
Max Distance(最大距离) :设置弹簧启用的最小距离值。如果两个对象之间的当前距离与初始距离的差大于该值,则不会开启弹簧。
Break Force(断开力) :设置弹簧关节断开所需的作用力。
Break Torque(断开转矩) :设置弹簧关节断开所需的转矩力。
Enable Collision(激活碰撞) :勾选该项,关节之间也会检测碰撞。
Enable Preprocessing(启用预处理) :勾选该项,实现关节的稳定。(该项默认为开启状态)
角色关节主要用于表现布娃娃效果,它是扩展的球关节,可用于限制关节在不同旋转轴下的旋转角度。
Connected Body(连接刚体) :用于为角色关节指定要连接的刚体。(若不指定刚体,则该关节默认与世界相连)
Anchor(锚点) :设置游戏对象局部坐标系中的点,角色关节将按围绕该点进行旋转。
Axis(扭动轴) :设置角色关节的扭动轴。(以橙色的圆锥gizmo表示)
Auto Configure Connected Anchor(自动设置连接锚点) :勾选该项,连接锚点会自动设置。(该项默认为开启状态)
Connected Anchor(连接锚点) :自动连接锚点项开启时,此项会自动设置。自动连接锚点项未开启时,可手动设置连接锚点。
Swing Axis(摆动轴) :设置角色关节的摆动轴。(以绿色的圆锥gizmo表示)
Twist Limit Spring(弹簧的扭曲限制)
Spring:设置角色关节扭曲的弹簧强度。
Damper:设置角色关节扭曲的阻尼值。
Low Twist Limit(扭曲下限) :设置角色关节扭曲的下限。
Limit:设置角色关节扭曲的下限值。
Bounciness:设置角色关节扭曲下限的反弹值。
Contact Distance:设置用于为了避免抖动而限制的接触距离。
High Twist Limit(扭曲上限) :设置角色关节扭曲的上限。
Limit:设置角色关节扭曲的上限值。
Bounciness:设置角色关节扭曲上限的反弹值。
Contact Distance:设置用于为了避免抖动而限制的接触距离。
Swing Limit Spring(弹簧的摆动限制)
Spring:设置角色关节摆动的弹簧强度。
Damper:设置角色关节摆动的阻尼值。
Swing 1,2 Limit(摆动限制1,2) :1与2的限制是对称的,即更改一个里面的三项属性即可。
Limit:设置角色关节摆动的限制值。
Bounciness:设置角色关节摆动限制的反弹值。
Contact Distance:设置用于为了避免抖动而限制的接触距离。
Enable Projection(启动投影) :该项用于激活投影。
Projection Distance(投影距离) :设置当对象与其连接刚体的距离超过投影距离时,该对象会回到适当的位置。
Projection Angle(投影角度) :设置当对象与其连接刚体的角度超过投影角度时,该对象会回到适当的位置。
Break Force(断开力) :控制角色关节断开所需的作用力。
Break Torque(断开转矩) :设置角色关节断开所需的转矩。
Enable Collision(激活碰撞) :勾选该项,则关节之间也会检测碰撞。
Enable Preprocessing(启用预处理) :勾选该项,实现关节的稳定。(该项默认为开启状态)
可配置关节组件支持用户自定义关节,它开放了PhysX引擎中所有与关节相关的属性,因此可像其他类型的关节那样来创造各种行为。
可配置关节有两类主要的功能:移动/旋转限制和移动/旋转加速度。
connected boby(连接刚体) :用于为关节指定要连接的刚体。(若不指定则该关节将与世界相连接)
anchor(锚点) :设置关节的中心点,所有基于物理效果的模拟都会以此点为中心点来进行计算。
axis(主轴) :设置局部旋转轴,该轴决定了对象在物理模拟下自然旋转的方向。
Auto Configure Connected Anchor(自动设置连接锚点) :勾选该项,连接锚点会自动设置。(该项默认为开启状态)
Connected Anchor(连接锚点) :自动连接锚点项开启时,此项会自动设置。自动连接锚点项未开启时,可手动设置连接锚点。
Secondary Axis(副轴) :主轴和副轴共同决定了关节的局部坐标。第三个轴与这两个轴所构成的平面相垂直。
Xmotion(X轴移动) :设置游戏对象在X轴的移动形式,有自由移动(Free)、锁定移动(Locked)及限制性移动(Limited)。
Ymotion(Y轴移动) :设置游戏对象在Y轴的移动形式,有自由移动(Free)、锁定移动(Locked)及限制性移动(Limited)。
Zmotion(Z轴移动) :设置游戏对象在Z轴的移动形式,有自由移动(Free)、锁定移动(Locked)及限制性移动(Limited)。
Angular Xmotion(X轴旋转) :设置游戏对象围绕X轴的旋转形式,有自由旋转(Free)、锁定旋转(Locked)及限制性旋转(Limited)。
Angular Ymotion(Y轴旋转) :设置游戏对象围绕Y轴的旋转形式,有自由旋转(Free)、锁定旋转(Locked)及限制性旋转(Limited)。
Angular Zmotion(Z轴旋转) :设置游戏对象围绕Z轴的旋转形式,有自由旋转(Free)、锁定旋转(Locked)及限制性旋转(Limited)。
Linear Limit Spring(弹簧线性限制)
Spring:弹簧。设置将对象拉回边界的力。
Damper:阻尼。设置弹簧的阻尼值。
Linear Limit(线性限制) :设置自关节原点的距离为基准对其运动边界加以限定。
Limit:限制。设置从原点到边界的距离。
Boundciness:反弹。设置当对象到边界时施加给它的反弹力。
Contact Distance:设置用于为了避免抖动而限制的接触距离。
Angular X Limit Spring(X轴旋转限制)
Spring:弹簧。设置将对象拉回边界的力。
Damper:阻尼。设置弹簧的阻尼值。
Low Angular X Limit(X轴旋转下限) :以与关节初始旋转的差值为基础设置旋转约束下限的边界。
Limit:旋转的限制角度。设置对象旋转角度的下限值。
Bounciness:反弹。设置当对象到边界时施加给它的反弹力。
Contact Distance:设置用于为了避免抖动而限制的接触距离。
High Angular X Limit(X轴旋转上限) :以与关节初始旋转的差值为基础设置旋转约束上限的边界。
Limit:旋转的限制角度。设置对象旋转角度的上限值。
Bounciness:反弹。设置当对象到边界时施加给它的反弹力。
Contact Distance:设置用于为了避免抖动而限制的接触距离。
Angular YZ Limit Spring(Y轴和Z轴旋转限制)
属性参数同Angular X Limit Spring
Angular Y Limit (Y轴旋转限制)*
属性参数同Angular X Limit
Angular Z Limit (Y轴旋转限制)*
属性参数同Angular X Limit
Target Position(目标位置) :关节在X,Y,Z三个轴向上应达到的目标位置。
Target Velocity(目标速度) :关节在X,Y,Z三个轴向上应达到的目标速度。
XDrive(X轴驱动) :设置了对象沿局部坐标系X轴的运动形式。
Position Spring:位置弹簧力。朝预定义方向上的皮筋的拉力。
Position Damper:位置阻尼。抵抗位置弹簧力的力。
Maximum Force:最大作用力。推动对象朝预定方向运动的作用力的总和。
YDrive(Y轴驱动) :设置了对象沿局部坐标系Y轴的运动形式。
属性参数同XDrive
ZDrive(Z轴驱动) :设置了对象沿局部坐标系Z轴的运动形式。
属性参数同XDrive
Target Rotation(目标旋转) :目标旋转是一个四元数,它定义了关节应当旋转到的角度。
Target Angular Velocity(目标旋转角速度) :目标旋转角速度是一个三维向量,它定义了关节应当旋转到的角速度。
Rotation Drive Mode (旋转驱动模式) :通过X&YZ轴驱动或插值驱动来控制对象自身的旋转。
Angular X Drive (X轴角驱动) :设置了关节如何围绕X轴进行旋转。
Position Spring:位置弹簧力。朝预定义方向上的皮筋的拉力。
Position Damper:位置阻尼。抵抗位置弹簧力的力。
Maximum Force:最大作用力。推动对象朝预定方向运动的作用力的总和。
Angular YZ Drive (YZ轴角驱动) :设置了关节如何围绕自身的Y轴和Z轴进行旋转。
属性参数同Angular X Drive
Slerp Drive(差值驱动) :设置了关节如何围绕局部所有的坐标轴进行旋转。
属性参数同Angular X Drive
Projection Mode(投影模式) :设置当对象离开其限定的位置过远时,会让该对象回到其受限制的位置。可设置为位置和旋转(Position and Rotation)以及不选择(None)。
Projection Distance(投射距离) :设置当对象与其连接刚体的距离超过投影距离时,该对象会回到适当的位置。
Projection Angle(投影角度) :设置当对象与其连接刚体的角度差超过投影角度时,该对象会回到适当的位置。
Configured In World Space(在世界坐标系中配置) :勾选该项,所有与目标相关的数值都会在世界坐标系中来计算,而不在对象的局部坐标系中计算。
Swap Bodies(交换体) :勾选该项,则应用交换刚体功能,连接着的两个刚体会发生交换。
Break Force(断开力) :设置控制关节断开所需的作用力。
Break Torque(断开转矩) :设置关节断开所需的转矩。
Enable Collision(激活碰撞) :勾选该项,关节之间也会检测碰撞。
Enable Preprocessing(启用预处理) :勾选该项,实现关节的稳定。(该项默认为开启状态)
B. Unity 物理系列二 AddForce velocity
https://docs.unity3d.com/cn/2019.4/ScriptReference/Rigidbody.AddForce.html
https://docs.unity3d.com/cn/2019.4/ScriptReference/ForceMode.html
Unity中关于作用力方式ForceMode的功能注解
功能注解:ForceMode为枚举类型,用来控制力的作用方式,有4个枚举成员,在以下举例中均设刚体质量为m=2.0f,力向量为f=(10.0f,0.0f,0.0f)。
默认方式,使用刚体的质量计算,以每帧间隔时间为单位计算动量。设FixedUpdate()的执行频率采用系统默认值(即0.02s),,则由动量定理f•t=m•v可得:10*0.02=2*v1,从而可得v1=0.1,即每帧刚体在X轴上值增加0.1米,从而可计算得刚体的每秒移动速度为v2=(1/0.02)*v1=5m/s。
在此种作用方式下会忽略刚体的实际质量而采用默认值1.0f,时间间隔以系统帧频间隔计算(默认值为0.02s),即f•t=1.0•v即可得v1= f•t=10*0.02=0.2,即刚体每帧增加0.2米,从而可得刚体的每秒移动速度为v2=(1/0.02)*v1=10m/s。
此种方式采用瞬间力作用方式,即把t的值默认为1,不再采用系统的帧频间隔,即f•1.0=m•v即可得v1=f/m=10.0/2.0=5.0,即刚体每帧增加5.0米,从而可得刚体每秒的速度为v2=(1/0.02)*5.0=250m/s。
此种作用方式下将忽略刚体的实际质量,采用默认质量1.0,同时也忽略系统的实际帧频间隔,采用默认间隔1.0,即f•1.0=1.0•v即可得v1=f=10.0,即刚体每帧沿X轴移动距离为10米,从而可得刚体每秒的速度为v2=(1/0.02)*v1=500m/s。
https://docs.unity.cn/cn/2019.4/ScriptReference/Rigidbody-velocity.html
刚体的速度矢量。它表示刚体位置的变化率。
在大多数情况下,不应该直接修改速度,因为这可能导致行为失真 - 改用 AddForce
请勿在每个物理步骤中设置对象的速度,这将导致不真实的物理模拟。 需要更改速度的一个典型用法是第一人称射击游戏中的跳跃动作设计,因为此时需要立即更改速度。
酷游戏的一些bug总结(滥用FixedUpdate的坑)
Unity3D中Rigidbody.velocity和Addforce的区别
假设我们想要做一个2D的跳跃游戏,在这个游戏里我希望我按下跳跃键的时候,游戏物体的跳跃高度是恒定的。
那么,如果此时我使用的是addForce显然不会满足我的效果,因为经过测试,每按一下跳跃键,它会被施加一个恒定的力,它跳跃的初始速度会越变越大,每次跳跃的高度和前一次相较变得越来越大(在连续跳跃的情况下),也就是可以理解成,我现在被施加了一个大小为50的力,在重力作用下我的力的效果在减小,在正向速度还没有完全消失的情况下,此时我又按了一下跳跃键,那么就会在这个力的基础上再施加一次大小为50的力,物体会越跳越快,越跳越高。
而此时如果我们使用的是velocity方法 改变它的初始速度到我们希望的值和方向 ,那么当我们按下跳跃键的时候,无论此时物体减速到何种情况,也最多只会提升到我们规定的速度以及朝向我们规定的方向。初始速度不变的情况下,跳跃高度也是恒定的。
解决:
AddForce之前应该清一下速率,因为是射线检测是否碰到地面,而跳跃后不会立刻离地。如果不清,后面几帧会累加AddForce。 清除速率保证离地的一瞬间肯定是正常Force,而非累加Force。
我们常在Unity开发中直接使用Rigidbody.velocity属性来获取刚体的当前速度,这在大多数情况下是没有问题的。但在某些情况下这么做就可能得不到我们想要的结果。比如通过transform.Translate(), transform.RotateAround(), rigidbody.MovePosition(), Vector3.MoveTowards() 等方法 “强制” 改变刚体的运动状态时,此时物体速度的改变并不会引起Rigidbody.velocity的改变。
而当我们把所有球的刚体组件中的Is Kinematic属性勾选上后,我们再来看看运行结果:
OMG!【仅移动】小球的Rigidbody.velocity居然又和真实速率一致了!
我并不了解Rigidbody.velocity这个属性在内部是如何被定义的,官方文档没有相关的说明,网上也没有找到相关的资料,我个人只能根据这些现象做如下的一些推测。
当刚体的Is Kinematic没有被勾选时,刚体的运动就被Unity的物理引擎所掌控,物体的运动和状态都会遵循真实世界的物理定律。我们知道,在牛顿力学中,要改变一个物体的运动状态必须要对其施加力,Unity也为我们提供了AddForce()方法。然而像MovePosition()这样的方法似乎可以让物体的运动随心所欲,能够以任意速度到达任意位置,可以让物体瞬间加到一个非常大的速度。显而易见,这种对运动状态的 “ 强制 ” 改变必定不能通过加力的方式实现,这就已经脱离了真实世界的物理定律了。 被物理引擎控制的物体擅自进行了不按套路的操作,Rigidbody.velocity就不会记录这种 “非法” 操作带来的速度改变,或者将这种非法操作对velocity的改变视为0。
反之,当刚体的Is Kinematic被勾选时,刚体的运动就脱离了Unity的物理引擎控制。风水轮流转,天道好轮回,这种情况下MovePosition()成了合法操作,AddForce()成了非法操作了。想要报仇雪恨的MovePosition()积攒了多年的怨气,对非法操作的限制变得更为严格,之前的情况还允许非法操作对物体运动状态的改变,这次已经完全屏蔽了AddForce()的作用。 从上一张截图就可看出,这次即便加力物体也始终保持静止。此时此刻MovePosition()终于作为合法操作被Rigidbody.velocity认可,使其能够反映物体真实速率。
总结
通过以上案例,我的想法就是最好不要对未勾选Is Kinematic的刚体使用 transform.Translate(), transform.RotateAround(),rigidbody.MovePosition(),Vector3.MoveTowards() 等等这些方法,毕竟这些非常规操作必定会对物理模拟的真实性产生影响。如果你不得不使用时,也请注意Rigidbody.velocity并不是物体在场景和游戏视图中的真实速度,不要滥用这些方法和这个属性而不小心掉入它的 “ 陷阱 ”。
https://docs.unity.cn/cn/2019.4/Manual/class-ConstantForce.html
恒定力 (Constant Force) 可用于快速向 刚体 添加恒定力。如果不希望某些一次性对象以较大的速度开始而是逐渐加速(比如火箭),则很适合使用恒定力。
要制作一个向前加速的火箭,请将 Relative Force 设定为沿正 z 轴。然后,使用刚体的 Drag 属性使其不超过某个最大速度(阻力越高,最大速度越低)。在刚体中,还要确保关闭重力,以便火箭始终保持在其路径上。
C. unity3d 主角拾取道具并判定的代码
Unity3D鼠标拾取物体可以通过射线的方式获取鼠标坐标 通过物理将物体名字输出进行操作。
function Update ()
{
if (Input.GetMouseButton (0))
{
var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
var hit : RaycastHit;
if (Physics.Raycast (ray, hit))
{
Debug.DrawLine (ray.origin, hit.point);
print(hit.collider.gameObject.name);
}
}
}
D. 如何在unity中实现靠近才能捡东西
可以使用钢体和碰撞控件来实现呀!
box collider 碰撞控件
rigidbody 钢体控件
将物件赋予钢体属性和碰撞检测属性,
当你的人物(或者是啥自己设定)走近此物件,将触发碰撞检测,
这里的检测判断可以是按键还是鼠标按键还是啥都可自行设定,
满足条件后就触发,比如放个烟花?或者回血?自行定义了。
以上希望可以帮助到你。
E. Unity抓取相机截图/抓取屏幕截图
在项目中,我们会遇到需要抓取相机截图,然后作为UI背景的需求。一般的思路如下:
处理将该渲染纹理作为UI背景,我们还可以充分利用该纹理做一些屏幕后处理特效加工。
与相机截图不一样的是,该屏幕截图会抓取所有渲染之后的结果(包含所有相机、UI渲染结果),相当于在手机上直接截图屏幕。
由于该截图需要获取到所有渲染,所以我们需要在所有渲染完毕后调用方法,因此会利用到携程的 WaitForEndOfFrame 对象。
这里我们用到的是 Texture2D 的 ReadPixels() 方法来采集渲染信息,而没有采用 RenderTexture ,有需要的话可以使用 Graphics.Blit(Texture source, RenderTexture dest); 将源纹理复制到目标渲染纹理中。
F. Unity的Joint到底怎样实现被绳子牵起来的物理效果
cube 上的铰链 joint
G. Unity3d在场景中如何选取物体
在角色上增加一个任意种类的collider,如果已经有了就不需要
第一种方法,在角色上写一个检测代码
class SelectChecker:MonoBehaviour
{
void OnMouseDown()
{
Debug.Log("OnMouseDown");
}
}
将该脚本拖到角色上即可。当点击一个角色时,输出OnMouseDown。这种是被动的方法
还有一个是主动的,需要通过物理射线检测来做,主要用到的函数为
Physics.RayCast方法,先将鼠标位置转化为射线,然后物理测试,代码片段如下
Class SelectChecker2:MonoBehaviour
{
void Update()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100))
{
//hit.collider.gameobject就是鼠标点中的物体
}
}
}
将该脚本放在任意一个gameobject上即可
以上代码纯手打,思路完全没有问题,但可能有个别语法或者拼写错误,请自行修正
H. 如何让unity中物理效果更加逼真
如何让unity中物理效果更加逼真
物理可能不是每个人最喜欢的那个科目,但事实是,物理学在游戏行业的发展中起着非常重要的作用。
想象在这样一个情况下:你终于决定要做一些大事情!一些值得注意的事情!有很多现实物理和图形的大事情!这是一个大游戏,一切都岌岌可危!
设计已经完成了,架构也已经弄好了,看上去一切就绪。但是这时候你开始实现最有技巧的那个部分:”游戏的物理部分”!
一切都开始分崩离析,你遇到了低FPS、奇怪的运动、碰撞/触发方面的问题,CPU使用率很高以及其他各种各样的问题。
错误或不适当的物理表现可以赶走潜在的玩家。而且它涉及的不仅仅是物理表现的不正确,它还会让一个原本流畅的游戏体验变得延迟不舒服。
让物理部分表现的很恰当而且不影响效率是不容易达到的。的确,物理是游戏开发过程中最困难和最重要的一部分,而且你根本避不开,必须面对它!
人们可以争论说,“好的物理表现需要非常快的CPU!”
但是相信我这并不总是真的!大多数时候可以通过深入分析Unity的原理来获得适当的物理表现!以及通过学习它是如何工作的来让物理部分表现的更好。
当我还是一个初学者的时候,我不得不处理100件和物理部分有关的事情。它大概花费了我一年的时间,我才记下在处理物理部分的时候需要记住的要点!
所以我决定写这篇文章,来帮你跳过这个痛苦的学习阶段,并成为游戏物理部分的专业开发人员!
我不会谈论如何使用Unity的物理部分,而我将列出技巧和要点来告诉你该如何优化你的游戏物理部分,所以如果你是一个初学者的话,我会建议你首先对Unity的物理部分有一个大概的了解。
因为物理是一个非常、非常、非常、非常(还可以有很多非常进行修饰:P)巨大而广泛的概念,我决定分成几个不同的部分和并尽可能的简化。
所以让我们开始吧!系好你的安全带,这将是一个漫长而愉快的旅程。
降低固定的更新时间间隔。。。!
Unity的文档是这么描述的,”物理部分的计算与更新是与帧速率无关的,FixedUpdate()时间也是与与帧速率无关的”。这个默认值是0.02(单位是秒),这意味着每20毫秒物理部分将要更新一次。所有的FixedUpdate() 函数也是20毫秒执行一次。
但是如果你的游戏不是严重依赖物理部分的话,你总是可以增加时间间隔,从而获得更好的结果。(即减少物理部分的调用)。
你需要对这个值进行测试调整来得到理想的效果。
让我们举个简单的例子:
“如果你要做一个简单的纸牌游戏,没有太多使用物理的地方。最好是减少调用物理引擎的次数。但是需要记住这么一个事情:如果你把调用物理引擎的次数减少的太多的话,你可能不会得到恰当的物理表现。”
让我们通过下面这些例子来更好的理解这个事情
1在场景中摆放3- 4球。让他们彼此相隔一定距离。
2创建一个物理材料,并将摩擦系数减少为0,并将反弹系数设为1。
3将新创建的物理材质附加到球体的碰撞体物理材质上。
4给球体添加刚体组件(这将向引擎表明它是一个物理物体)。
5在场景中摆放一个平面,并且按需要来给这个平面添加物理材质。
6让球体保持在平面上的一定距离,并且让重力影响这些球体。
7按下播放键,检查结果。
这些球体会不停的弹上弹下。
这与固定时间步长有什么关系?
上面这些只是一些预设置,现在我们来调整下固定的时间步长值。
在菜单栏里面找到Edit >> Project Settings>> Time ,在这里你将看到Fixed Time Step Value:the value will be around 0.02(正如我之前提到的那样)。
现在把这个值提为0.1,然后再执行游戏。
你注意到区别是什么了么?
首先你会注意到球体有一些运动滞后。
其次,球体不会反弹了,而是直接穿过了平面。
为什么会这样?(不需要跳动的如此之快:P)
如果你把固定时间步长设置为0.1,那么这意味着物理部分的更新将每100毫秒发生一次,这很明显的有点过长了,并且将无法将测到碰撞。
这表明过多的降低固定时间步长也不是个很理想的情况。现在让我们改变时间步长为更实用的值0.03 - 0.04(根据你的球体的设置可能会有所不同)。
现在如果你执行游戏的话,你将无法看到任何变化。只要物理看起来适合你,那就没关系。如果你仔细检查的话,物理碰撞会略有不同。
I. 如何使用unity3d制作出真实的物理效果
给物体添加物理特性即可,在属性里面,使其具有碰撞,重力等物理性质