一、创建角色(胶囊体)
1、胶囊体
创建一个胶囊体,右键生成一个父物体,再把MainCamera拖入到父物体下面。这样我们的角色就创建好了。
2、添加组件
添加character Controller
二、添加脚本
1、创建脚本
创建一个第一人称控制的脚本,取名可以取 FPCharacterContronllerMovement ,意味第一人称移动控制器,注意不要取名CharacterContronller,会和Unity中自带的脚本重名。
2、编写脚本
using System.Collections;
using UnityEngine;
/// <summary>
/// 第一人称角色控制器移动脚本
/// </summary>
public class FPCharacterContronllerMovement : MonoBehaviour
{
// 角色控制器组件
private CharacterController characterController;
// 角色的变换组件
private Transform characterTransform;
// 重力加速度
public float Gravity = 9.8f;
// 移动方向向量
private Vector3 movementDirection;
// 跳跃高度
public float JumpHeight = 3;
// 奔跑速度
public float SprintSpeed = 8;
// 行走速度
public float WalkSpeed = 4;
// 下蹲高度
public float CrouchHeight = 1f;
// 是否处于下蹲状态
private bool isCrouched;
// 角色控制器的原始高度
private float orginHeight;
// 下蹲时的奔跑速度
public float SprintingWhenCrouched = 4;
// 下蹲时的行走速度
public float WalkWhenCrouched = 2;
// 在游戏开始时调用
void Start()
{
// 获取角色控制器组件
characterController = GetComponent<CharacterController>();
// 获取角色的变换组件
characterTransform = characterController.transform;
// 保存角色控制器的原始高度
orginHeight = characterController.height;
}
// 每帧调用一次
void Update()
{
Move();
}
/// <summary>
/// 平滑改变角色高度的协程
/// </summary>
/// <param name="_target">目标高度</param>
private IEnumerator DoCrouch(float _target)
{
// 临时变量,用于平滑过渡
float tmp_CurrentHeight = 0;
// 循环直到角色高度接近目标高度
while(Mathf.Abs(characterController.height - _target) > 0.1f)
{
// 等待下一帧
yield return null;
// 平滑改变角色高度
characterController.height = Mathf.SmoothDamp(characterController.height, _target, ref tmp_CurrentHeight, Time.deltaTime * 5);
}
}
///</summary>
/// 移动角色
/// </summary>
public void Move()
{
// 当前速度,默认为行走速度
float tmp_CurrentSpeed = WalkSpeed;
// 如果角色接触地面
if (characterController.isGrounded)
{
// 获取水平输入
var tmp_Horizontal = Input.GetAxis("Horizontal");
// 获取垂直输入
var tmp_Vertical = Input.GetAxis("Vertical");
// 计算移动方向(基于角色的朝向)
movementDirection = characterController.transform.TransformDirection(
new Vector3(tmp_Horizontal, 0, tmp_Vertical));
// 如果按下跳跃键
if (Input.GetButtonDown("Jump"))
{
// 设置移动方向的y轴为跳跃高度
movementDirection.y = JumpHeight;
}
// 如果按住左Shift键,使用奔跑速度,否则使用行走速度
tmp_CurrentSpeed = Input.GetKey(KeyCode.LeftShift) ? SprintSpeed : WalkSpeed;
}
// 如果按下C键
if (Input.GetKeyDown(KeyCode.C))
{
// 计算目标高度(下蹲或站起)
var tmp_CurrentHeight = isCrouched ? orginHeight : CrouchHeight;
// 启动协程,平滑改变角色高度
StartCoroutine(DoCrouch(tmp_CurrentHeight));
// 切换下蹲状态
isCrouched = !isCrouched;
}
// 应用重力
movementDirection.y -= Gravity * Time.deltaTime;
// 移动角色
characterController.Move(movementDirection * Time.deltaTime * tmp_CurrentSpeed);
}
}
注意点:
movementDirection = characterController.transform.TransformDirection(
new Vector3(tmp_Horizontal, 0, tmp_Vertical));
这里要把角色移动的输入,将向量从本地空间转换到世界空间的方法。
如果不使用
TransformDirection
如果不使用
TransformDirection
,角色的移动方向会始终基于世界空间,而不是基于角色的朝向。例如:如果角色向右转了 90 度,但输入的移动方向仍然是基于世界空间的“前”方向,角色会看起来像是在侧向移动。
总结
TransformDirection
是一个非常重要的方法,它确保角色的移动方向是基于角色的朝向(本地空间),而不是基于世界空间。这使得角色的移动更加自然,符合玩家的直觉。
括号里面的参数,是unity中默认的在
里面,如果发现是空白的,或者不一样。可以尝试删除这个配置文件后重新打开项目。
希望对你有用:)