返回

Unity中FPS角色第一人称视角和移动控制:深入浅出的学习笔记

闲谈

在Unity中创建具有第一人称视角(FPS)的玩家角色需要精通多种技术。从控制玩家的运动到管理相机的旋转,有多个方面需要考虑。本教程将指导您完成在Unity中实现FPS视角和移动控制所需的步骤,使用刚体和字符控制器来实现逼真的移动,并限制视角旋转以获得最佳游戏体验。

刚体与字符控制器

Unity提供了两种主要的组件来处理游戏对象的物理和移动:刚体和字符控制器。刚体更适合于模拟物理对象,而字符控制器则专门设计用于控制玩家角色的运动。在本教程中,我们将使用刚体来控制相机的运动,并使用字符控制器来处理玩家的移动。

FPS视角控制

要实现FPS视角,我们需要控制摄像机的旋转以反映玩家的头部运动。为此,我们将使用鼠标输入来控制相机的上下旋转,并使用键盘输入来控制左右旋转。

刚体设置

首先,将刚体组件添加到摄像机对象。在刚体组件的约束属性中,取消勾选冻结旋转X和冻结旋转Z。这将允许摄像机在这些轴上自由旋转。

鼠标控制脚本

接下来,创建一个脚本(例如,FPSLook.cs)来处理鼠标输入和摄像机的旋转。在脚本中,使用以下代码来捕获鼠标输入并旋转摄像机:

using UnityEngine;

public class FPSLook : MonoBehaviour
{
    public float sensitivity = 10f;

    private float _rotationX = 0f;
    private float _rotationY = 0f;

    void Update()
    {
        _rotationX += Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime;
        _rotationY += Input.GetAxis("Mouse X") * sensitivity * Time.deltaTime;

        transform.localRotation = Quaternion.Euler(_rotationX, _rotationY, 0f);
    }
}

将此脚本附加到摄像机对象上,调整灵敏度值以获得所需的旋转速度。

字符控制器设置

要控制玩家的移动,我们将使用字符控制器组件。将字符控制器组件添加到玩家对象。在字符控制器组件的移动属性中,选中使用根动作,取消选中重力。这将禁用重力,并使我们能够使用脚本来控制玩家的移动。

移动控制脚本

创建一个脚本(例如,FPSMove.cs)来处理键盘输入和玩家移动。在脚本中,使用以下代码来捕获键盘输入并移动玩家:

using UnityEngine;

public class FPSMove : MonoBehaviour
{
    public float speed = 10f;

    private CharacterController _controller;

    void Start()
    {
        _controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");

        Vector3 movement = (transform.forward * v) + (transform.right * h);

        _controller.Move(movement * speed * Time.deltaTime);
    }
}

将此脚本附加到玩家对象上,调整速度值以获得所需的移动速度。

视角限制

为了确保玩家视角保持在合理范围内,我们将限制摄像机的旋转。为此,在FPSLook脚本中添加以下代码:

_rotationX = Mathf.Clamp(_rotationX, -90f, 90f);

这将限制摄像机的垂直旋转为-90度到90度,防止玩家的头部过分向上或向下看。

完整代码

// FPSLook.cs
using UnityEngine;

public class FPSLook : MonoBehaviour
{
    public float sensitivity = 10f;

    private float _rotationX = 0f;
    private float _rotationY = 0f;

    void Update()
    {
        _rotationX += Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime;
        _rotationY += Input.GetAxis("Mouse X") * sensitivity * Time.deltaTime;

        _rotationX = Mathf.Clamp(_rotationX, -90f, 90f);

        transform.localRotation = Quaternion.Euler(_rotationX, _rotationY, 0f);
    }
}

// FPSMove.cs
using UnityEngine;

public class FPSMove : MonoBehaviour
{
    public float speed = 10f;

    private CharacterController _controller;

    void Start()
    {
        _controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");

        Vector3 movement = (transform.forward * v) + (transform.right * h);

        _controller.Move(movement * speed * Time.deltaTime);
    }
}

通过遵循本教程的步骤,您将能够在Unity中实现一个完全可控的第一人称视角和移动控制系统。这些技术对于创建逼真且引人入胜的FPS游戏至关重要。