提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、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);
}
推荐阅读
- Unity|Unity中RampTex介绍和应用: 溶解特效优化
- Unity|Unity中SmoothStep介绍和应用: 溶解特效优化
- 3D|Unity3D入门笔记01
- Unity3d|Unity Gameplay工具集(Unity Gameplay Tool Set)
- 虚幻|12_ue4进阶末日生存游戏开发[优化行走跑步后退]
- unity|Unity3D GUI控件
- unity|Unity3D中基本GUI控件介绍
- Unity|Unity C# 网络学习(十一)——自定义协议生成工具
- Unity3d-2019.4-简易红绿灯