Unity中FPS角色第一人称视角和移动控制:深入浅出的学习笔记
2023-09-19 00:41:27
在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游戏至关重要。