Unity CharacterController控制人物移动(包括重力实现)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在使用CharacterController组件时,人物移动一般有两种方式,一种是无重力移动–>SimpleMove,一种是有重力移动–>Move。而使用有重力移动时,又会出现人在下楼梯时无法贴合地面,从而造成飞天效果,最终导致方向键控制混乱的现象。下面介绍一下本文实现方法,若有不正确的地方,望各位大佬们指正!


一、Move和SimpleMove区别

Move:角色不受重力约束,需要自己实现重力效果。
SimpleMove:会受到重力的影响,返回值是是否着地。

二、具体实现

1.Move方法

代码如下(示例):

 horizontalInput = Input.GetAxis("Horizontal");

 VerticalInput = Input.GetAxis("Vertical");

 if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
 {
      characterController.Move(mainCamera.TransformDirection(new Vector3(horizontalInput, 0, VerticalInput)) * moveSpeed); 
 }

那么有了移动的方法,如何实现下落功能呢?

需要定义的参数

    public float Speed = 12f;
    public float Gravity = 20f;
    private Vector3 m_Velocity;
    
    public Transform GroundCheck;//需要检测和是否和地面接触的物体
    public float GroundDistance;
    public LayerMask GroundMask;

和移动方法一样,放在update中运行即可。这部分代码是扒的Unity官方的第一人称控制器代码,用于解决CharacterController控制人物移动时下楼梯会飞天,导致轴向混乱。

 m_IsGrounded = Physics.CheckSphere(GroundCheck.position, GroundDistance, GroundMask);//检测体m_groundcheck与layerMask层接触后则返回一个true
 if (m_IsGrounded && m_Velocity.y < 0)
 {
     m_Velocity.y = -2;
 }
 m_Velocity.y -= Time.deltaTime * Gravity;

 characterController.Move(m_Velocity * Time.deltaTime);

2.SimpleMove方法

代码如下(示例):

 horizontalInput = Input.GetAxis("Horizontal");

 VerticalInput = Input.GetAxis("Vertical");

 if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
 {
      characterController.SimpleMove(transform.TransformDirection(new Vector3(horizontalInput, 0, VerticalInput)) * moveSpeed); 
 }