角色控制器可以让你更容易的处理有有碰撞的运动,同时不用处理刚体。(也就是说角色控制器负责处理角色的移动,如果添加角色控制器,就不用在添加刚体组件)
角色控制器不受力的影响,并且只有当你调用move函数时才会移动。他的运动收碰撞的约束。
Slope Limit爬坡限制:小于等于此角度可以上坡
Step Offset台阶高度:
Skin Width 皮肤宽度:额外的增加这段距离可以触发碰撞, 一般其值很小但不为0
Min Move Distance:0,太多不行,太小动不了
Center:中心点坐标
Radius:半径,一般0.5
Height:高,一般2.0
以下代码不可运行,理解。
在角色跳跃上的应用:
if(grounded)
{
//按键移动的水平和垂直轴对应世界坐标的x与z轴
moveDirection = new Vector3(parameter.inputMoveVector.x, 0,parameter.inputMoveVector.y);
// parameter.inputMoveVector = new Vector2(input.GetAxis("Horizontal"),input.GetAxis("Vertical"));
//世界方向转为自身方向
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
if(parameter.inputJump)
{
moveDirection.y = jumpSpeed;
AudioSource.PlayClipAtPoint(jumpAudio, transform.position);
CurrentSpeed();
}
}
//下降过程
moveDirection.y -= gravity * Time.deltaTime;
//更新控制器的位置(同时也会移动子节点摄像机的位置)
CollisionFlags flags = controller.Move(moveDirection * Time.deltaTime);
//是否接触地面
grounded = (flags & CollisionFlags.Below) != 0;
//CollisionFlags是CharactorController的返回值,Below表示胶囊体脚部与地面碰撞的信息,
//Side--身体发生碰撞,如撞在了墙上。 Above--头顶发生碰撞
在角色下蹲上的应用:
//角色蹲下使更新角色控制器的高度和中心点
if(crouching)//下蹲状态
{
controller.height = normalControllerHeight - crouchDeltaHeight;
controller.center = normalControllerCenter - new Vector3(0,crouchDeltaHeight/2,0);
}
else
{
controller.height = normalControllerHeight;
controller.center = normalControllerCenter;
}
为什么下蹲中心点是下蹲距离的一半呢?
因为下蹲距离就是胶囊体直径(高度)减少了,而中心点下降距离即为半径,所以是一半。