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);
}