# 物理角色控制器 CharacterController

在一些典型的场景下,例如控制着主角在充满障碍物的世界里移动,会需要对某个物体(主角)的位移具有完全的控制力,但又需要让主角能被障碍物(碰撞体)所阻挡。物理角色控制器就是专门了为这一类场景而设计的组件。

物理角色控制器需要搭配刚体来使用,并且会自带一个胶囊碰撞体,在组件属性中可以设置胶囊碰撞体的形状。

# 重要方法和事件

方法名 描述
move 移动物理角色控制器,会被障碍物阻挡。
simpleMove 类似move,按照给定的速度移动,会受重力影响。
reposition 瞬移物理角色控制器(类似于修改Rigidbody.position)。
事件名 事件对象 描述
onControllerColliderHit ControllerColliderHit 如果在move()的过程中被障碍物所阻挡,会生成该事件。

为物理角色控制器添加事件回调,可以参考碰撞体添加事件回调的方法

# 物理角色控制器的移动

和刚体一样,可以直接修改Transform的位置,来让物理角色控制器达到瞬移的效果。瞬移的过程中,不会被任何物体所阻挡,一定会在目标地点出现。如果目标地点有普通的刚体,则会在下一帧把它们挤开。

除了瞬移之外,一般情况下的移动应当选择move方法。使用了move之后,物理角色控制器会立刻沿直线移动到目标位置。如果落地位置有其他碰撞体(静态碰撞体或刚体)存在,则会沿直线被阻挡,不会推动其他刚体,也不会与其他碰撞体相交。

move的过程中,物理角色控制器一定会保持头顶朝上,只可能沿 y 轴发生旋转。如果遇到了斜坡或台阶,物理角色控制器可以模拟出爬上斜坡和台阶的行为,最大能爬上的高度可以在组件属性中设置。

实践中,可以在游戏角色移动时,每帧调用movesimpleMove来移动固定的一小段距离,模拟角色走路的行为。

#运动学刚体的区别

物理角色控制器的实际表现有一点类似运动学刚体,它不会在物理模拟的过程中发生位移或旋转。
但与运动学刚体不同的是:

  1. 物理角色控制器不能为Trigger;
  2. 物理角色控制器没有movePosition方法,没法沿直线挤开其他刚体。