# 脚本基础2
# 物理引擎
# 刚体
刚体组件可使游戏对象受物理引擎控制,在受到外力时产生类似真实世界中的运动。
刚体组件的常用属性:
- 质量 Mass:物体的质量。
- 阻力 Drag:当受力移动时物体受到的空气阻力。0表示没有空气阻力,极大时可使物体停止运动,通常砖头0.001,羽毛设置为10。
- 角阻力 Angular Drag:当受扭力旋转时物体受到的空气阻力。0表示没有空气阻力,极大时使物体停止旋转。
- 使用重力 Use Gravity:若激活,则物体受重力影响。
- 是否是运动学 Is Kinematic:若激活,该物体不再受物理引擎控制,而只能通过变换组件来操作。
- 插值 Interpolate:用于缓解刚体运动时的抖动。
- 无 None --不应用插值。
- 内插值 Interpolate -- 基于上一帧的变换来平滑本帧变换。
- 外插值 Extrapolate -- 基于下一帧的预估变换来平滑本帧变换。
- 碰撞检测 Collision Detection:碰撞检测模式。快速移动的刚体在碰撞时有可能互相穿透,可以在这里设置碰撞检测频率,但频率越高对物理引擎性能影响越大。
- 不连续 Discrete:不连续碰撞检测。适用于普通碰撞(默认模式)。
- 连续 Continuous:连续碰撞检测。
- 动态连续 Continuous Dynamic:连续动态碰撞检测,适用于高速物体。
- 约束 Constraints:对刚体运动的约束。
- 冻结位置 Freeze Position:刚体在世界中沿所选X,Y,Z轴的移动将无效。
- 冻结旋转 Freeze Rotation:刚体在世界中沿所选的X,Y,Z轴的旋转将无效。
# 碰撞器
刚体让物体能够模拟物理碰撞,而碰撞器规定了碰撞的外轮廓部分。它们需要配合在一块使用,碰撞器分为:
- 静态碰撞器 Static Collider:只有碰撞器没有刚体的物体;该类碰撞器基本保持静止或者轻微移动,一般应用于环境模型,如地面/树木,和刚体碰撞时不会移动。
- 刚体碰撞器 Rigidbody Collider:具有刚体和碰撞器的物体;该类碰撞器完全受物理引擎和脚本的影响。
- 运动学刚体碰撞器 Kinematic Rigidbody Collider: 同时附加刚体和碰撞器,并且激活刚体组件的IsKinematic;该类碰撞器不受力影响,不能添加力,只能通过transform来移动。能影响其他的刚体,和其他碰撞器碰撞时不会受影响,但是会触发碰撞函数。
- Character Controllers(角色控制器):允许高速运动时立刻转身,可以执行碰撞检测保证角色可以沿墙滑动或者上下台阶。受重力影响,不受碰撞产生的力影响,可以由代码施加的力推动。不具有物理特性。如果想让角色控制器推开其他刚体或者对象,可以在对象附加的脚本中添加OnControllerColliderHit()函数,使得碰撞生效。
碰撞器的属性如下:
- 是否触发器 Is Trigger:激活后,此碰撞器用于触发事件,并且被物理引擎忽略。
- 材质 Material:引用何种物理材质决定了它和其他对象如何作用。
# 物理材质
用于调整碰撞对象对其他对象的摩擦力和反弹效果。它具有的属性如下:
- 动态摩擦力 Dynamic Friction:移动时摩擦力
- 静态摩擦力 Static Friction:静止时摩擦力
- 弹力(Bounciness):反弹程度。备注:摩擦力、弹力在0到1之间
- 两个碰撞对象摩擦力(Friction Combine Mode)/弹力(Bounce Combine)的合并方式:
- 平均值 Average
- 最小 Min
- 最大 Max
- 相乘 Multiply
# 碰撞条件
碰撞条件有:
- 两个物体都有碰撞体。
- 两个物体中任意一个物体有刚体。
碰撞分三个阶段:
- 当进入碰撞时执行 void OnCollisionEnter(Collision collOther)
- 当碰撞体与刚体接触时每帧执行 void OnCollisionStay(Collision collOther)
- 当停止碰撞时执行 void OnCollisionExit(Collision collOther)
# 触发条件
触发条件有:
- 两个物体都有碰撞体。
- 两个物体中任意一个物体有刚体。
- 两个物体中任意一个碰撞体的isTrigger被选中。
同样触发也分三个阶段:
- 当碰撞体进入触发器时执行 void OnTriggerEnter(Collider cldOther)
- 当碰撞体与触发器接触时每帧执行 void OnTriggerStay(Collider cldOther)
- 当停止触发时执行 void OnTriggerExit (Collider cldOther)
# 关节
关节组件可以添加至多个游戏对象中,而添加关节的游戏对象将通过关节连接在一起并且感觉连带的物理效果。需要注意的是:关节必须依赖于刚体组件。
关节基本分为:
- 链条关节(hinge joint):将两个物体以链条的形式绑在一起,当力量大于链条的固定力矩时,两个物体就会产生相互的拉力。
- 固定关节(fixed joint):将两个物体永远以相对的位置固定在一起,即使发生物理改变,它们之间的相对位置也将不变。
- 弹簧关节(spring joint):将两个物体以弹簧的形式绑定在一起,挤压它们会得到向外的力,拉伸它们将得到向里的力。
- 角色关节(character joint):可以模拟角色的骨骼关节。
- 可配置关节(configurable joint):可以模拟任意关节的效果。
# 链条关节
该关节将关节将两个刚体 (Rigidbody) 组合在一起,从而将其约束为如同通过铰链连接一样进行移动。它十分适合门,也可用于对链条、钟摆等进行模拟效果。它具有的属性有:
- 连接体 (Connected Body):对关节 (Joint) 所依赖的刚体 (Rigidbody) 的可选引用。如果未设置,则关节 (Joint) 连接到世界坐标。
- 锚点 (Anchor):主体围绕其摇摆的轴的位置。
- 轴 (Axis):主体围绕其摇摆的轴的方向。
- 使用弹簧 (Use Spring):启用使用弹簧 属性。
- 弹簧 (Spring):对象为移动到位所施加的力。
- 目标位置 (Target Position):使刚体 (Rigidbody) 相对于其连接体达到特定角度。
- 阻尼 (Damper):此值越高,对象减慢的幅度越大。
- 使用电机 (Use Motor):启用使用电机 (Use Motor) 时使用的电机 (Motor) 的属性。
- 目标速率 (Target Velocity):对象尝试达到的速度。
- 力 (Force):为达到该速度而应用的力。
- 自由旋转 (Free Spin):如果启用,则电机从不用于对旋转制动,仅进行加速。
- 使用限制 (Use Limits) :如果启用,则铰链角度会限制在最小(Min)和最大(Max)值内。
- 限制 (Limits): 启用使用限制 (Use Limits)s 时使用的限制 (Limits) 的属性。
- 折断力 (Break Force):为使此关节 (Joint) 折断而需要应用的力。
- 折断扭矩 (Break Torque):为使此关节 (Joint) 折断而需要应用的扭矩。
- 启动碰撞Enable Collision:如果启用,将启用与绑定物体之间的碰撞效果。
# 开门效果
用链条关节制作开门效果:
- 给门框添加刚体(并取消重力),给门添加铰链关节。
- 将门框作为门的连接体。
- 调节门铰链关节的位置以及角度。
- 此时可通过电机或者弹力设置开门效果。
- 电机方式:启用电机,设置目标速率跟力,并限制开门的角度。
- 弹性方式:启用弹性,设置弹力大小,并给一个目标位置角度。
# 固定关节
固定关节将对象移动限制为依赖于其他对象。这在某种程度上类似于父子化 ,不过是通过物理而不是变换层级结构来实现。使用它们的最佳情况是在具有要方便地相互分离的对象时使用。固定关节具有的属性:
- 连接体 (Connected Body):对关节(Joint)所依赖的刚体(Rigidbody)的可选引用。如果未设置,则关节 (Joint) 连接到世界坐标。
- 折断力 (Break Force):为使此关节 (Joint) 折断而需要应用的力
- 折断扭矩 (Break Torque):为使此关节 (Joint) 折断而需要应用的扭矩
- 启动碰撞Enable Collision:如果启用,将启用与绑定物体之间的碰撞效果。
# 弹性关节
弹簧关节将两个刚体(Rigidbody)组合在一起,从而将其约束为如同通过弹簧连接一样进行移动效果。弹性关节的属性如下:
- 连接体 (Connected Body):对关节所依赖的刚体 (Rigidbody) 的可选引用。
- 锚点 (Anchor):对象局部坐标空间中定义关节中心的位置(静止时)。这不是将对象拉向的位置。
- 弹簧 (Spring):弹簧的强度。
- 阻尼 (Damper):弹簧在处于活动状态时缩减的量。
- 最小距离 (Min Distance):大于此值的距离不会使弹簧激活。
- 最大距离 (Max Distance):小于此值的距离不会使弹簧激活。
- 折断力 (Break Force):为使此关节折断而需要应用的力。
- 折断扭矩 (Break Torque):为使此关节折断而需要应用的扭矩。
- 启动碰撞 Enable Collision:如果启用,将启用与绑定物体之间的碰撞效果。