当前位置: 首页 > news >正文

unity 第一人称控制器

使用直接挂到要控制的物体上就行

using UnityEngine;

[RequireComponent(typeof(CharacterController))]
public class FirstPersonController : MonoBehaviour
{
    [Header("移动设置")]
    [Tooltip("移动速度")]
    public float movementSpeed = 5.0f;
    [Tooltip("跳跃速度")]
    public float jumpSpeed = 8.0f;
    [Tooltip("重力(正数值)")]
    public float gravity = 20.0f;
    
    [Header("键盘旋转设置")]
    [Tooltip("左右旋转的速度(角度/秒),用于 Q/E 键")]
    public float rotationSpeed = 100.0f;
    
    [Header("鼠标旋转设置")]
    [Tooltip("鼠标灵敏度,用于按住右键时跟随鼠标左右旋转")]
    public float mouseSensitivity = 3.0f;
    
    // 内部变量:保存当前的运动方向
    private Vector3 moveDirection = Vector3.zero;
    private CharacterController characterController;
    
    void Start()
    {
        characterController = GetComponent<CharacterController>();
    }
    
    void Update()
    {
        // 处理移动与跳跃
        if (characterController.isGrounded)
        {
            // 获取 WASD 或箭头键输入
            float horizontalInput = Input.GetAxis("Horizontal");
            float verticalInput = Input.GetAxis("Vertical");

            // 构造局部方向:前后左右
            Vector3 forward = transform.forward;
            Vector3 right = transform.right;
            moveDirection = (forward * verticalInput + right * horizontalInput).normalized * movementSpeed;

            // 跳跃(默认使用空格键)
            if (Input.GetButton("Jump"))
            {
                moveDirection.y = jumpSpeed;
            }
        }
        
        moveDirection.y -= gravity * Time.deltaTime;
        // 使用 CharacterController.Move() 移动角色(确保帧率独立性)
        characterController.Move(moveDirection * Time.deltaTime);
        
        // 键盘旋转:Q/E 键
        if (Input.GetKey(KeyCode.Q))
        {
            transform.Rotate(Vector3.up, -rotationSpeed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.E))
        {
            transform.Rotate(Vector3.up, rotationSpeed * Time.deltaTime);
        }
        
        // 鼠标旋转:按住鼠标右键,跟随鼠标左右移动旋转
        if (Input.GetMouseButton(1))
        {
            // Input.GetAxis("Mouse X") 获取鼠标水平移动量
            float mouseDeltaX = Input.GetAxis("Mouse X");
            transform.Rotate(Vector3.up, mouseDeltaX * mouseSensitivity);
        }
    }
}
 

http://www.xdnf.cn/news/535015.html

相关文章:

  • std::ranges::views::as_const 和 std::ranges::as_const_view
  • ABAP创建类
  • 【Tools】VMware Workstation 17.6 Pro安装教程
  • windows使用ollama部署deepseek及qwen
  • SnapEdit安卓版:AI赋能,一键抠图与创意编辑
  • 创新点!贝叶斯优化、CNN与LSTM结合,实现更准预测、更快效率、更高性能!
  • 基于jsp+mysql+Spring的Springboot旅游网站管理系统设计和实现
  • OpenWeatherMap API ,常见的方式来管理 API Key:
  • 系统思考:动态性复杂
  • 0519Java面试题总结
  • 网络漏洞扫描系统都有哪些类型?
  • PAW3950DM-T5QU游戏级光导航芯片
  • 博图1200硬件组态与启保停程序编写步骤详解
  • AM32电调学习解读九:ESC上电启动关闭全流程波形分析
  • 无人机遥控器光纤通信模块技术要点!
  • 前端(vue)学习笔记(CLASS 6):路由进阶
  • 公网ip是固定的吗?动态ip如何做端口映射?内网ip怎么让外网远程访问?
  • FastAPI自定义异常处理:优雅转换Pydantic校验错误
  • 【占融数科-注册/登录安全分析报告】
  • python里的\和/有什么区别
  • 汇编:电子计数器
  • SCT2A10一款4.5V-85V 0.6A 高效率同步可调频率的降压DCDC转换器
  • Kubernetes高阶使用指南:深入探索容器编排的艺术
  • 基于大模型的手术全流程智能决策支持系统大纲
  • 关于systemverilog中在task中使用force语句的注意事项
  • 核保核赔的集中管理方案
  • GO语言学习(五)
  • 【C/C++】C++并发编程:std::async与std::thread深度对比
  • GPFS故障实际生产故障处理分析
  • 告诉我,pavucontrol的用法,我连接耳机的时候,输入设备应该使用什么呢?