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

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

文章目录
  • 前言
  • 一、Move和SimpleMove区别
  • 二、具体实现
    • 1.Move方法
    • 2.SimpleMove方法

前言 在使用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方法 【Unity|Unity CharacterController控制人物移动(包括重力实现)】代码如下(示例):
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); }

    推荐阅读