一、物理系统相关组件
Unity中的物理系统涉及的组件分为如下几类:
- 刚体
- 角色控制器
- 碰撞体
- 布料
- 关节
- 力场
二、刚体(Rigidbody)
Rigidbody(刚体)组件可以使游戏对象在物理系统的控制下进行运动,Rigidbody 可接受外力与扭矩力,用以保证游戏对象像在真实世界中那样进行运动。任何游戏对象只有添加了Rigidbody 组件之后才能受到重力的影响,通过脚本为游戏对象添加的作用力以及通过 NVIDIA物理引擎与其他的游戏对象发生互动的运算都需要游戏对象添加 Rigidbody 组件。
Rigidbody组件的属性如下:
属性 | 作用 |
---|---|
Mass | 质量 |
Drag | 阻力。指物体受力运动时受到的空气阻力 |
Angular Drag | 角阻力。指物体受力旋转时受到的阻力 |
Use Gravity | 是否启用重力 |
Is Kinematic | 是否开启动力学。如果开启,则游戏物体不再受物理引擎影响,只能通过Transform控制 |
Interpolate | 插值。用来控制刚体运动时的抖动情况。包括如下选项:「None」没有插值;「Interpolate」内插值,基于前一帧的Transform平滑此次Transform;「Extrapolate」外插值,基于下一帧的Transform平滑此次Transform |
Collision Detection | 碰撞检测模式。包括如下选项:「Discrete」离散碰撞检测;「Continuous」连续碰撞检测;「Continuous Dynamic」连续动态碰撞检测;「Continuous Speculative」连续推断碰撞检测 |
Constraints | 约束。「Freeze Position」冻结指定轴向的位移;「Freeze Rotation」冻结指定轴向的旋转 |
2.1 关于碰撞检测模式(Collision Detection)
Rigidbody组件内置了四种碰撞检测模式,官方的解释有些晦涩,这里借用一张贴吧大佬的图(原帖地址)。图中箭头指的是采用A模式的物体撞击采用B模式的物体,箭头中间的值表示两个物体碰撞时实际采用的检测模式。
比如说采用了「Continuous」模式的物体,撞击不带刚体的物体(也就是图中的Static),最终将采用「Continuous」模式进行碰撞检测。而如果两个采用「Continuous」模式的物体相撞,则会采用「Discrete」模式进行检测。
对于离散碰撞检测(Discrete),因为是以帧为单位进行检测,所以如果遇到高速移动的物体A,在上一帧还在B物体的外侧,而下一帧就已经穿过A到达另一侧,就会出现碰撞检测没有触发的情况。因此才有了两种连续碰撞检测模式。其中连续碰撞检测(Continuous)适用于可能被高速对象撞击的对象,连续动态碰撞检测(Continuous Dynamic)适用于可能发生碰撞的高速对象。
需要注意:
- 连续碰撞检测会增加额外的性能消耗,因此在没有相应需求的情况下不要使用。
- 只有盒型碰撞体、球形碰撞体和胶囊碰撞体支持连续碰撞检测。
连续推断碰撞检测(Continuous Speculative)是一种新增的碰撞检测模式,它相对于前两种连续碰撞检测更加节省性能,但也可能会导致穿隧效应和幽灵碰撞。详情可以查看官方文档
2.2 通过刚体控制角色移动
一种是通过设置刚体的线速度和角速度实现角色移动
private void FixedUpdate()
{
var horizontal = Input.GetAxis("Horizontal");
var vertical = Input.GetAxis("Vertical");
// 设置线速度
_rigidbody.velocity = transform.forward * (vertical * moveSpeed);
// 设置角速度
_rigidbody.angularVelocity = transform.up * (horizontal * rotateSpeed);
}
效果如下
另一种是通过MovePosition()
和MoveRotation()
方法控制
private void FixedUpdate()
{
var horizontal = Input.GetAxis