当前位置: 首页 > 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.dtcms.com/a/199851.html

相关文章:

  • C语言之 比特(bit)、字节(Byte)、字(Word)、整数(Int)
  • 学习黑客PowerShell的历史、架构与工作原理深度解析
  • ## Docker 中 Elasticsearch 启动失败:日志文件权限问题排查与解决
  • 什么是仓储管理,仓储管理怎么做
  • 【Android构建系统】Soong构建系统,通过.bp + .go定制编译
  • 【成品设计】基于STM32的的宠物看护系统
  • MySQL - 如何突破单库性能瓶颈
  • Qt读取Excel文件的技术实现与最佳实践
  • MySQL替换瀚高数据库报错: TO_DAYS()不存在(APP)
  • DNS服务搭建
  • 基于vue框架的东莞市二手相机交易管理系统5yz0u(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 家庭数字生态构建实战:基于飞牛fnOS的智能家居数据中台搭建全流程解析
  • 云原生环境下的事件驱动架构:理念、优势与落地实践
  • 架构演变 -单体到云原生
  • RK3568解码1080P视频时遇到系统崩溃内核挂掉的解决方案
  • 云原生攻防1(基础介绍)
  • 【Linux网络】传输层协议UDP
  • TCP和套接字SSL加密连接行为分析
  • 【Hadoop】--HA高可用搭建--3.2.2
  • mcp 学习第二篇
  • HTTPS实验室——TLS/TLCP一站式解决方案
  • 深入理解 Hadoop 核心组件 Yarn:架构、配置与实战
  • 上路兵线的理解-鳄鱼篇
  • vue3:十三、分类管理-表格--编辑、新增、详情、刷新
  • Android framework 问题记录
  • 整合安全能力:观测云进一步强化数据价值
  • 【内测征集】LarkVR 播控系统上新:VR 应用一站式专业播控与管理工具
  • 避开封禁陷阱:动态IP在爬虫、跨境电商中的落地实践
  • 电脑A和电脑B都无法ping通电脑C网络,电脑C可以ping通电脑A和B,使用新系统测试正常,排除硬件问题。
  • PLC双人舞:profinet转ethernet ip网关奏响施耐德与AB的协奏曲