Unity(简单实现第一人称角色移动)

一、创建角色(胶囊体)

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中默认的在

里面,如果发现是空白的,或者不一样。可以尝试删除这个配置文件后重新打开项目。

希望对你有用:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值