# 物理角色控制器 CharacterController
在一些典型的场景下,例如控制着主角在充满障碍物的世界里移动,会需要对某个物体(主角)的位移具有完全的控制力,但又需要让主角能被障碍物(碰撞体)所阻挡。物理角色控制器就是专门了为这一类场景而设计的组件。
物理角色控制器不需要搭配刚体来使用,并且会自带一个胶囊碰撞体,在组件属性中可以设置胶囊碰撞体的形状。
# 重要方法和事件
方法名 | 描述 |
---|---|
move | 移动物理角色控制器,会被障碍物阻挡。 |
simpleMove | 类似move ,按照给定的速度移动,会受重力影响。 |
reposition | 瞬移物理角色控制器(类似于修改Rigidbody.position )。 |
事件名 | 事件对象 | 描述 |
---|---|---|
onControllerColliderHit | ControllerColliderHit | 如果在move() 的过程中被障碍物所阻挡,会生成该事件。 |
为物理角色控制器添加事件回调,可以参考碰撞体添加事件回调的方法。
# 物理角色控制器的移动
和刚体一样,可以直接修改Transform
的位置,来让物理角色控制器达到瞬移的效果。瞬移的过程中,不会被任何物体所阻挡,一定会在目标地点出现。如果目标地点有普通的刚体,则会在下一帧把它们挤开。
除了瞬移之外,一般情况下的移动应当选择move
方法。使用了move
之后,物理角色控制器会立刻沿直线移动到目标位置。如果落地位置有其他碰撞体(静态碰撞体或刚体)存在,则会沿直线被阻挡,不会推动其他刚体,也不会与其他碰撞体相交。
move
的过程中,物理角色控制器一定会保持头顶朝上,只可能沿y轴发生旋转。如果遇到了斜坡或台阶,物理角色控制器可以模拟出爬上斜坡和台阶的行为,最大能爬上的高度可以在组件属性中设置。
实践中,可以在游戏角色移动时,每帧调用move
或simpleMove
来移动固定的一小段距离,模拟角色走路的行为。
# 与运动学刚体的区别
物理角色控制器的实际表现有一点类似运动学刚体,它不会在物理模拟的过程中发生位移或旋转。
但与运动学刚体不同的是:
- 物理角色控制器不能为Trigger;
- 物理角色控制器没有
movePosition
方法,没法沿直线挤开其他刚体。