物理引擎
# 物理引擎
游戏中模仿现实情况下物体运动规则的引擎
# Rigidbody组件
又名刚体,赋予物体现实中物理规则。但光有刚体不行,当执行游戏时,刚体物体在运动轨迹上没有受体阻拦就会一直往下坠。因此我们还需要受体才能模拟真实的物理运动情况。
# 属性
- Mass: 重量,游戏策划应当统一单位
- Drag: 阻力,空气阻力,摩擦力... 通常砖头0.001,羽毛10
- Angular Drag: 角阻力,旋转时的阻力
- Interpolate: 用于缓解刚体运动时的抖动
- 内插值 Interpolate - 基于上一帧的变换来平滑该帧
- 外插值 Extrapolate - 基于下一帧的变化来平滑该帧
- Collision Detection: 碰撞检测模式,快速移动的刚体在碰撞时有可能互相穿透,可以设置碰撞检测频率,但过高频率影响性能
- 不连续 Discrete: 不连续碰撞检测,适用于普通模式
- 连续 Continuous: 连续碰撞检测
- 动态连续 Continuous Dynamic: 连续动态碰撞检测,适用于高速物体
- Constraints: 对刚体运动的约束
- 冻结位置 Freeze Position: 刚体在世界中沿所选X,Y,Z轴的移动将无效
- 冻结选择 Freeze Rotation: 刚体在世界中沿所选的X,Y,Z轴的旋转无效
- IsGravity: 是否受重力影响,模拟太空可能用到
# Collider组件
又名受体,赋予物体接触刚体的能力
在Unity中,提供了许多Collider
- Box Collider
- Capsule Collider
- Circle Collider 2D
- Mesh Collider
- Sphere Collider
- Terrain Collider
- Wheel Collider
这些碰撞器除了形状不同,我们还需要考虑其性能,因为往往场景里会有许许多多的静态物体,而他们为了与角色产生反应,必须被赋予Collider,一旦数量庞大可能会影响性能,这点在手游中尤为明显,在手游中的规则是,能用Box Collider就尽量用,可以减少性能消耗。
- IsTrigger:勾选后,勾选的物体将不再受到碰撞(其他物体可从他这里穿过去),物体将不再触发
OnCollisionXXX
事件,而是触发OnTriggerXXX
事件
# 碰撞阶段
- 当进入碰撞时执行(接触的第一帧)
void OnCollisionEnter(Collision collOther)
- 当Collider与Rigidbody碰撞时(接触时,每一帧)
void OnCollisionStay(Collision collOther)
- 当停止碰撞时执行(接触时的最后一帧)
void OnCollisionExit(Collision collOther)
# 补充
上面的事件中参数Collision可以通过collOther.gameObject
获取触碰物体的对象
还可以通过collOther.GetContact(index)
获取接触点,可以用于判断受击打的部位以及溅血特效
有时我们想模拟子弹射击速度时,子弹往往会因为速度过快导致无法被检测,解决方案是开始时使用射线进行检测。