
CharacterController是Unity自带的组件,常用于第三人称或第一人称角色控制,可以简单的把它看成一个可以指定移动方向的胶囊碰撞体,角色控制器允许您在受碰撞约束的情况下轻松进行移动,而无需处理刚体。
组件| 属性 | 介绍 |
|---|---|
| Slope Limit | 角色能爬坡的最大角度 |
| Step Offset | 角色能上台阶的最大高度 |
| Skin Width | 两个characterController能够穿透彼此皮肤的最大深度,高的值可以减少抖动,低的值容易让角色卡住,比较好的值是Radius的10%。如果你的角色经常卡住,很可能就是这个值太小了。 |
| Min Move Distance | 最小移动距离,如果移动距离低于这个值,则不会移动。可以较少角色的抖动。 |
| Center | 胶囊碰撞体的中心点 |
| Radius | 胶囊碰撞体的半径(胖瘦) |
| Height | 胶囊碰撞体的高度 |
区别
| Move | SimpleMove | |
|---|---|---|
| 官方介绍 | Supplies the movement of a GameObject with an attached CharacterController component. | Moves the character with speed. |
| 参数 | 沿y轴的速度被忽略。 速度以米/秒为单位。 重力是自动应用的。 | 移动时候需要注意乘以时间 |
| 重力 | 重力自动应用 | 没有重力,需要自己添加 |
| 返回值 | bool,是否贴地 | CollisionFlags,碰撞信息 |
void Update()
{
controller.SimpleMove(forward * speed);
controller.Move(forward * speed * Time.deltaTime);
}
建议每帧只调用一次Move或者SimpleMove
CharacterController不会受到任何力的影响,也不会对任何物体产生力。
如果想实现物理效果,则可以在下列事件中添加自己想实现的效果
| 事件 | 描述 |
|---|---|
| OnCollisionEnter | collider进入controller时触发 |
| OnCollisionExit | collider从controller内离开时触发 |
| OnCollisionStay | 有Collider停留在controller内时触发 |
| OnTriggerEnter | trigger进入controller时触发 |
| OnTriggerExit | trigger从controller内离开时触发 |
| OnTriggerStay | 有trigger停留在controller内时触发 |
| OnControllerColliderHit | 和其他的controller碰撞时触发 |
private void OnControllerColliderHit(ControllerColliderHit hit)
{
float power = 2.0F;
Rigidbody hitRigidBody = hit.collider.attachedRigidbody;
if (hitRigidBody == null || hitRigidBody.isKinematic)
{
return;
}
//给碰撞物体附加当前速度对应的力
hitRigidBody.AddForce(_Controller.velocity * power);
}
参考资料
【Unity学习笔记】CharacterController组件_一白梦人的博客-CSDN博客_charactercontroller组件