U3L19——角色控制器

角色控制器

角色控制器是让角色可以受制于碰撞,但是不会被刚体所牵制
如果我们对角色使用刚体判断碰撞,可能会出现一些奇怪的表现
比如:

  1. 在斜坡上往下滑动
  2. 不加约束的情况碰撞可能让自己被撞飞

等等
而角色控制器会让角色表现的更加稳定
Unity提供了角色控制器脚本专门用于控制角色

注意:
添加角色控制器后,不用再添加刚体****能检测碰撞函数
能检测触发器函数
能被射线检测

注意!如果使用角色控制器,那就不再建议使用动画上的根运动了!建议关闭Apply Root Motion
我们会通过角色控制器来达到控制角色移动的目的

本章代码关键字

1
2
3
4
5
CharacterController               //角色控制器类 
characterController.isGrounded //检测是否在地面
characterController.SimpleMove //受到重力的移动
characterController.Move //不受重力的移动
OnControllerColliderHit() { } //角色控制器专属的碰撞函数

角色控制器的使用

参数相关

image

  • Slope Limit 坡度度数限制,大于该值的斜坡上不去
  • Step Offset:台阶偏移值,单位为米,低于这个值的台阶才能上去,该值不能大于角色控制器的高度
  • Skin Width:皮肤的宽度,
    两个碰撞体可以穿透彼此最大的皮肤宽度,较大的值可以减少抖动,
    较小的值可能导致角色卡住,建议设置为半径的10%
  • MinMoveDistance:最小移动距离,
    大多数情况下为0,可以用来减少抖动

代码相关

首先需要获取该对象的角色控制器

1
2
3
4
5
6
7
8
9
public class Lesson59 : MonoBehaviour
{
private CharacterController characterController;

void Start()
{
characterController = GetComponent<CharacterController>();
}
}

关键参数

是否接触了地面
1
2
3
4
if (characterController.isGrounded)
{
print("接触地面了");
}

关键方法

受重力作用的移动
1
characterController.SimpleMove(Vector3.forward * 10 * Time.deltaTime);
不受重力作用的移动
1
characterController.Move(Vector3.forward * 10 * Time.deltaTime);

角色控制器碰撞函数

当角色控制器想要判断和别的碰撞器产生碰撞时 使用该函数 使用方法和和碰撞检测函数差不多

注意!OnCollisionEnter() 对角色控制器没有用,检测触发器OnTriggerEnter()可以使用

1
2
3
4
private void OnControllerColliderHit(ControllerColliderHit hit)
{
print(hit.collider.gameObject.name);
}