You need to enable JavaScript to run this app. Unity3D如何实现角色移动?3D FPS游戏键鼠移动功能开发问询
优惠活动
大模型
产品
解决方案
定价
更多

Unity3D如何实现角色移动?3D FPS游戏键鼠移动功能开发问询

Unity 3D FPS 基础移动与视角控制实现方案

前期准备

  • 给角色对象添加 CharacterController 组件(比原生刚体更适配FPS移动逻辑,可避免不必要的物理碰撞卡顿问题)
  • 在角色对象下挂载相机作为子物体,调整相机初始位置对齐角色头部高度
  • 确认Unity输入管理器中默认的Horizontal/Vertical/Mouse X/Mouse Y轴配置未被修改

1. 键盘控制角色移动实现

核心逻辑为读取键盘方向输入,将输入值转换为跟随当前角色朝向的世界空间移动向量,调用组件接口执行移动:

  • 核心可调参数:moveSpeed 移动速度,初始推荐设置为5f
  • 所有位移计算需乘以Time.deltaTime,保证不同帧率下移动速度一致
  • 移动方向要基于角色当前的transform.right(左右方向)和transform.forward(前后方向)计算,保证移动方向和视角朝向匹配

2. 鼠标控制视角移动实现

核心逻辑为读取鼠标XY轴偏移量,X轴偏移控制角色整体左右旋转,Y轴偏移控制相机上下俯仰,同时限制俯仰角度避免视角翻转:

  • 核心可调参数:mouseSensitivity 鼠标灵敏度,初始推荐设置为100f;maxLookAngle 最大俯仰角度,推荐设置为90f
  • 鼠标输入值需乘以Time.deltaTime和灵敏度参数做适配
  • 上下俯仰角度使用Mathf.Clamp()限制在-maxLookAngle到maxLookAngle区间,防止视角转过后仰出现颠倒

完整可运行脚本示例

将以下脚本挂载到角色根对象上,把角色下的相机拖到脚本的playerCam字段即可直接使用:

using UnityEngine;

[RequireComponent(typeof(CharacterController))]
public class FPSController : MonoBehaviour
{
    [Header("移动参数")]
    public float moveSpeed = 5f;
    
    [Header("视角参数")]
    public Camera playerCam;
    public float mouseSensitivity = 100f;
    public float maxLookAngle = 90f;
    
    private CharacterController _controller;
    private float _xRotation = 0f;

    void Start()
    {
        _controller = GetComponent<CharacterController>();
        // 启动时锁定鼠标到游戏窗口中心
        Cursor.lockState = CursorLockMode.Locked;
    }

    void Update()
    {
        // 处理视角转动逻辑
        float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;

        _xRotation -= mouseY;
        _xRotation = Mathf.Clamp(_xRotation, -maxLookAngle, maxLookAngle);
        
        playerCam.transform.localRotation = Quaternion.Euler(_xRotation, 0f, 0f);
        transform.Rotate(Vector3.up * mouseX);
        
        // 处理移动逻辑
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");

        Vector3 moveDir = transform.right * horizontalInput + transform.forward * verticalInput;
        _controller.Move(moveDir.normalized * moveSpeed * Time.deltaTime);
    }
}

测试时如果鼠标未锁定无法转动视角,点击一次游戏窗口即可自动锁定,按ESC键可解锁鼠标

内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 23:21:00