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

Unity3D学习FPS游戏(3)玩家第一人称视角转动和移动

前言:上一篇实现了角色简单的移动控制,但是实际游戏中玩家的视角是可以转动的,并根据转动后视角调整移动正前方。本篇实现玩家第一人称视角转动和移动,觉得有帮助的话可以点赞收藏支持一下!

玩家第一人称视角

  • 修复小问题-武器反向
  • 玩家视角转动和移动
    • 视角转动
    • 移动控制更新
    • 完整代码
    • 效果
  • 补充知识
    • 鼠标设置

修复小问题-武器反向

上一篇文章武器模型的方向反了,武器模型Y方向旋转180度就好了。
在这里插入图片描述

玩家视角转动和移动

视角转动

思路分析

FPS游戏中玩家可以通过移动鼠标来旋转视角。

最简单的思路就是,获取鼠标移动的值,然后修改玩家Player对象的Rotation。

但是直接修改Player的Rotation不对!!!

为什么?

  • 修改Player的Rotation的值后,移动控制会根据当前视角为前方移动,会存在朝着斜上方走的情况。
  • 如果是带有玩家模型的话,直接Rotation属性来旋转整个Player,垂直方向旋转的时候就会让玩家的模型也垂直转动,会很诡异。一般都是枪支和手才会参与所有的旋转,玩家的身体模型是不会参与垂直。

怎么办?

  • 水平Rotation修改Player的;
  • 垂直Rotation修改Camera的;
  • Player挂载Camera,Camera挂载Weapon武器(有手的话也挂载在相机下面)。

这样Player水平旋转带动玩家模型、相机还有武器(和手),但是相机垂直旋转只会带动武器(和手)。

调整Player挂载

Player挂载Camera,Camera挂载Weapon。
在这里插入图片描述

视角移动

补充在我们PlayerController代码中,添加两个新的变量用来记录鼠标移动X和Y的累计偏移,还有一个Transform变量playerCamera来获取和控制相机的Rotation。

private float x_RotationOffset = 0;// 累计x旋转
private float y_RotationOffset = 0;// 累计y旋转
public Transform playerCamera;// 这个在Unity中把Camera拖到变量就行
private void PlayerRotation()
{// 获取鼠标移动x_RotationOffset += Input.GetAxis("Mouse X")* Time.deltaTime * mouseSensitivity;// 水平方向y_RotationOffset += Input.GetAxis("Mouse Y")* Time.deltaTime * mouseSensitivity;// 垂直方向// 旋转transform.rotation = Quaternion.Euler(new Vector3(0, x_RotationOffset, 0));// Player旋转playerCamera.localRotation= Quaternion.Euler(new Vector3(y_RotationOffset, playerCamera.localEulerAngles.y, playerCamera.localEulerAngles.z));// Camera旋转
}

视角角度限制

把PlayerRotation()添加到Update中运行后,可以发现视角会随着偏移。但是玩家会随着鼠标偏移无限制的旋转视角,尤其是垂直视角,这并不符合我们FPS游戏体验。

需要对旋转的范围做出一个限制,修改PlayerRotation(),对垂直视角添加Mathf.Clamp进行限制。

private void PlayerRotation()
{// 获取鼠标移动x_RotationOffset += Input.GetAxis("Mouse X")* Time.deltaTime * mouseSensitivity;// 水平方向y_RotationOffset += Input.GetAxis("Mouse Y")* Time.deltaTime * mouseSensitivity;// 垂直方向// 限制垂直旋转角度y_RotationOffset = Mathf.Clamp(y_RotationOffset, -45f, 45f);// 旋转transform.rotation = Quaternion.Euler(new Vector3(0, x_RotationOffset, 0));// Player旋转playerCamera.localRotation= Quaternion.Euler(new Vector3(y_RotationOffset, playerCamera.localEulerAngles.y, playerCamera.localEulerAngles.z));// Camera旋转
}

鼠标锁定

前面虽然实现了随着鼠标转动视角,但是会发现没法像真正游戏的第一视角锁定鼠标(移动了之后鼠标还是在中间),反而会离开屏幕。

在Start()函数部分加入鼠标锁定代码。

Cursor.lockState = CursorLockMode.Locked;

移动控制更新

会发现视角变了后,但是移动的方向的前后左右并没有跟随视角,需要对移动控制的代码进行更新。

原先是直接在X、Y和Z分量上直接加入输入的值,我们为计算的加入Transformer的方向重新计算输入的值到不同的分量的值。

修改后的PlayerMovement()代码如下:

public void PlayerMovement()
{// CharacertController的Move函数需要输入一个三维的向量// 每个分量表示三维不同方向前进多少Vector3 moveDirection = Vector3.zero;// 获取键盘输入// Horizontal左右移动;Vertical前后移动// 加入自身tranform方向moveDirection = Vector3.zero;moveDirection += transform.forward  * Input.GetAxis("Vertical");moveDirection += transform.right * Input.GetAxis("Horizontal");m_Controller.Move(moveDirection * Time.deltaTime*speed);
}

完整代码

PlayerController代码,实现了玩家视角移动和转动的所有代码。

public class PlayerController : MonoBehaviour
{public CharacterController m_Controller;public Transform playerCamera;public float moveSpeed = 6.0F;public float mouseSensitivity = 1000.0F;private float x_RotationOffset = 0;// 累计x旋转private float y_RotationOffset = 0;// 累计y旋转void Start(){m_Controller = this.GetComponent<CharacterController>();Cursor.lockState = CursorLockMode.Locked;// 鼠标锁定}void Update(){PlayerRotation();PlayerMovement();}// 控制角色移动public void PlayerMovement(){Vector3 moveDirection = Vector3.zero;// 获取键盘输入:Horizontal左右移动;Vertical前后移动// 加入自身tranform方向moveDirection = Vector3.zero;moveDirection += transform.forward  * Input.GetAxis("Vertical");moveDirection += transform.right * Input.GetAxis("Horizontal");// 移动m_Controller.Move(moveDirection * Time.deltaTime*moveSpeed);}// 控制角色视角private void PlayerRotation(){// 获取鼠标移动x_RotationOffset += Input.GetAxis("Mouse X")* Time.deltaTime * mouseSensitivity;// 水平方向y_RotationOffset += Input.GetAxis("Mouse Y")* Time.deltaTime * mouseSensitivity;// 垂直方向// 限制垂直旋转角度y_RotationOffset = Mathf.Clamp(y_RotationOffset, -45f, 45f);// 旋转transform.rotation = Quaternion.Euler(new Vector3(0, x_RotationOffset, 0));// Player旋转playerCamera.localRotation= Quaternion.Euler(new Vector3(y_RotationOffset, playerCamera.localEulerAngles.y, playerCamera.localEulerAngles.z));// Camera旋转}
}

效果

在这里插入图片描述

补充知识

鼠标设置

可见性

Cursor.visible = true;   //设置鼠标可见
Cursor.visible = false;  //设置鼠标不可见

锁定

Cursor.lockState = CursorLockMode.None;//不锁定,自由移动状态
Cursor.lockState = CursorLockMode.Locked;//锁定状态,第一人称常用
Cursor.lockState = CursorLockMode.Confined;//限制状态,鼠标只能在游戏界面内移动

形状
菜单-Edit-Project Settings-Player,可以设置鼠标图标。
在这里插入图片描述

相关文章:

Unity3D学习FPS游戏(3)玩家第一人称视角转动和移动

前言&#xff1a;上一篇实现了角色简单的移动控制&#xff0c;但是实际游戏中玩家的视角是可以转动的&#xff0c;并根据转动后视角调整移动正前方。本篇实现玩家第一人称视角转动和移动&#xff0c;觉得有帮助的话可以点赞收藏支持一下&#xff01; 玩家第一人称视角 修复小问…...

引领数字未来:通过企业架构推动数字化转型的策略与实践

在全球经济迅速数字化的背景下&#xff0c;企业正面临日益复杂的挑战。为了保持竞争优势&#xff0c;企业必须迅速调整其业务模式&#xff0c;采用先进的技术&#xff0c;推动业务创新。企业架构&#xff08;EA&#xff09;作为企业转型的战略工具&#xff0c;在这一过程中发挥…...

计算机毕业设计Python+大模型恶意木马流量检测与分类 恶意流量监测 随机森林模型 深度学习 机器学习 数据可视化 大数据毕业设计 信息安全 网络安全

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; Python大模型恶意木马流量检…...

ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用

本文整理于 2024 年云栖大会阿里云智能集团高级技术专家金吉祥&#xff08;牟羽&#xff09;带来的主题演讲《ApsaraMQ Serverless 能力再升级&#xff0c;事件驱动架构赋能 AI 应用》 云消息队列 ApsaraMQ 全系列产品 Serverless 化&#xff0c;支持按量付费、自适应弹性、跨可…...

Xcode 16.1 (16B40) 发布下载 - Apple 平台 IDE

Xcode 16.1 (16B40) 发布下载 - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 发布日期&#xff1a;2024 年 10 月 28 日 Xcode 16.1 包含适用于 iOS 18.1、iPadOS 18.1、Apple tvOS 18.1、watchOS 11.1、macOS Sequoia 15.1 和 visionOS 2.1 的 SDK。Xco…...

使用ONNX Runtime对模型进行推理

今天的深度学习可谓是十分热门&#xff0c;好像各行各业的人都会一点。而且特别是Hinton获得诺奖后&#xff0c;更是给深度学习添了一把火。星主深知大家可能在平时仅仅将模型训练好后就不会去理会它了&#xff0c;至于模型的部署&#xff0c;很多人都没有相关经验。由于我最近…...

五款pdf转换成word免费版,谁更胜一筹?

作为一名在都市丛林中奋斗的打工人&#xff0c;每天处理各种文件是家常便饭。尤其是PDF和Word文档之间的转换&#xff0c;简直是日常工作中不可或缺的一部分。今天&#xff0c;我就来和大家分享一下我使用过的几款PDF转Word免费版工具&#xff0c;看看它们的表现如何。 一、福…...

【C++】踏上C++学习之旅(四):细说“内联函数“的那些事

文章目录 前言1. "内联函数"被创造出来的意义2. 内联函数的概念2.1 内联函数在代码中的体现2.2 普通函数和内联函数的汇编代码 3. 内联函数的特性&#xff08;重点&#xff09;4. 总结 前言 本章来聊一聊C的创作者"本贾尼"大佬&#xff0c;为什么要创作出…...

SVN克隆或更新遇到Error: Checksum mismatch for xxx

文章目录 前言问题的产生探索解决方案正式的解决方法背后的故事总结 前言 TortoiseSVN 作为版本控制常用的工具&#xff0c;有一个更为人们熟知的名字 SVN&#xff0c;客观的讲SVN的门槛相比Git而言还是低一些的&#xff0c;用来存储一些文件并保留历史记录比较方便&#xff0…...

QT交互界面:实现按钮运行脚本程序

一.所需运行的脚本 本篇采用上一篇文章的脚本为运行对象&#xff0c;实现按钮运行脚本 上一篇文章&#xff1a;从0到1&#xff1a;QT项目在Linux下生成可以双击运用的程序&#xff08;采用脚本&#xff09;-CSDN博客 二.调用脚本的代码 widget.cpp中添加以下代码 #include &…...

驱动和芯片设计哪个难

驱动和芯片设计哪个难 芯片设计和驱动开发 芯片设计和驱动开发 都是具有挑战性的工作&#xff0c;它们各自有不同的难点和要求。 对于芯片设计&#xff0c;它是一个集高精尖于一体的复杂系统工程&#xff0c;涉及到从需求分析、前端设计、后端设计到流片的全过程。 芯片设计的…...

【云原生】云原生后端:监控与观察性

目录 引言一、监控的概念1.1 指标监控1.2 事件监控1.3 告警管理 二、观察性的定义三、实现监控与观察性的方法3.1 指标收集与监控3.2 日志管理3.3 性能分析 四、监控与观察性的最佳实践4.1 监控工具选择4.2 定期回顾与优化 结论参考资料 引言 在现代云原生架构中&#xff0c;监…...

在 ubuntu20.04 安装 docker

1、替换清华源 替换 sources.list 里面的内容 sudo vim /etc/apt/sources.list# 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse # deb-src htt…...

前端开发设计模式——观察者模式

目录 一、定义和特点 1. 定义 2. 特点 二、实现方式 1. 使用 JavaScript 实现观察者模式的基本结构 2. 实际应用中的实现示例 三、使用场景 1. 事件处理 2. 数据绑定 3. 异步通信 4. 组件通信 四、优点 1. 解耦和灵活性 2. 实时响应和数据一致性 3. 提高代码的可…...

永磁同步电机高性能控制算法(17)——无差拍预测转速控制

1.前言 前期写了比较多的关于无差拍预测电流控制的东西。 https://zhuanlan.zhihu.com/p/659205719https://zhuanlan.zhihu.com/p/659205719 https://zhuanlan.zhihu.com/p/660266190https://zhuanlan.zhihu.com/p/660266190 https://zhuanlan.zhihu.com/p/719591343https://z…...

【GIT】Visual Studio 中 Git 界面中, 重置 和 还原

在 Visual Studio 的 Git 界面中&#xff0c;“重置” 和 “还原” 是两个常用的 Git 操作。它们的主要区别在于应用场景和影响范围。 1. 重置&#xff08;Reset&#xff09; 重置用于更改当前分支的提交历史&#xff0c;通常用于撤销或删除某些提交。重置操作可能会更改 Git…...

开源一款前后端分离的企业级网站内容管理系统,支持站群管理、多平台静态化,多语言、全文检索的源码

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一款前后端分离的企业级网站内容管理系统&#xff0c;支持站群管理、多平台静态化&#xff0c;多语言、全文检索的源码。 前言 在当今的数字化时代&#xff0c;企业网站和个人博客已成为信息传播和品牌建设的重要渠道。…...

【electron+vue3】使用JustAuth实现第三方登录(前后端完整版)

实现过程 去第三方平台拿到client-id和client-secret&#xff0c;并配置一个能够外网访问回调地址redirect-uri供第三方服务回调搭建后端服务&#xff0c;引入justauth-spring-boot-starter直接在配置文件中定义好第一步的三个参数&#xff0c;并提供获取登录页面的接口和回调…...

Amcor 如何借助 Liquid UI 实现SAP PM可靠性

背景介绍 安姆科是塑料行业的全球领军企业&#xff0c;该企业认识到 SAP 工厂维护&#xff08;SAP PM&#xff09;对于确保高效的维护管理的重要性。 在诸如制造业等高度依赖机械设备的行业中&#xff0c;SAP PM是一种通过数据驱动决策来最大限度减少停机时间、降低间接成本、…...

【Redis】常见基本全局命令

一、Redis俩大核心命令 由于Redis是以键值对的形式进行数据存取&#xff0c;自然就离不开不断的存储和获取&#xff0c;而其所对应的命令则是set和get&#xff0c;如此说来二者为Redis的核心基础命令也不为过。 作用&#xff1a;用于存储Stirng类型的数据 返回&#xff1a;当…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...