实现WSAD移动方向,鼠标右键旋转角度,滚轮实现缩放

在此之前,我们先讲清楚几个比较容易混淆的点:

1:Transform.forward是Transform组件的一个Vector3类型的属性,代表游戏对象在世界坐标系中的朝向,即“前方向”,它的值是(0,0,1),它表示了一个对象的X轴方向,一般用于计算游戏对象前进的方向,比如用于移动、旋转和射线检测等场景。

2:Transform.Right的数学表达式是(1, 0, 0)。它表示了一个对象的X轴方向,或者说是它的右侧方向

值得注意的是,它们都是单位向量,一般只用于方向计算

3:Input.GetAxis("Horizontal")和Input.GetAxis("Vertical"),input.GetAxis("Mouse X")

它们是分别获取水平方向输入和竖直方向输入的函数,这个函数会返回一个范围在-1到1之间的浮点数,表示当前水平方向上的输入状态

比如Input.GetAxis("Mouse X") 返回鼠标在水平方向上的移动,以浮点数表示。当鼠标向右移动时,返回正值;当鼠标向左移动时,返回负值。如果鼠标不动,返回0

Input.GetAxis("Mouse ScrollWheel"),向前滚动是正数,向后滚动时负数

4:欧拉角和四元数

在unity中的rotation就是使用了欧拉角,欧拉角指的是以三个轴为基准,通过绕不同轴的旋转角度来表示一个物体的旋转状态,通常有XYZ、ZYX、ZXY等多种旋转顺序。但是,欧拉角会存在万向锁问题,即在某些特定情况下,两个轴的旋转会发生重合,导致旋转计算异常

四元数则是通过四元数的定义和运算来实现旋转,四元数实际上是一个四元组,包含了一个实部和三个虚部。它们的定义方式和欧拉角不同,可以避免万向锁问题,并且旋转顺序不会影响旋转结果。四元数还可以通过插值运算实现平滑旋转,适用于需要连续旋转的情况。

我把代码分成了三块

第一个模块是WSAD控制前后左右,这段比较简单,直接定义一个V3类型的移动方向,再使用Translate即可

第二个模块是使用QE控制上下视角,定义一个变量upDown,每次按键时候改变1,然后直接把位置赋值到相机位置即可

第三个模块是使用鼠标右键进行旋转,设置两个旋转向量rotateX,rotateY,Y方向旋转限值minAngle和maxAngle,然后把向量和速度加到相机的欧拉角即可

有一个难点,在刚开始调试的时候,第一次点击鼠标右键进行旋转时,屏幕一直跳动,最后经过GPT的帮助,最终解决了问题!爱死GPT

using UnityEngine;
public class CameraController : MonoBehaviour
{//WSAD相机移动速度public float moveSpeed = 1.0f;//相机当前移动方向private Vector3 moveDirection;//QE相机的目标高度private float upDistance;public float upSpeed = 0.2f;//鼠标右键控制旋转private float rotateX,rotateY;public float sensitivity =0.5f;//控制鼠标在Y方向上的限值public float minAngle = -90f;public float maxAngle = 90f;//记录之前的欧拉角,避免跳屏private Vector3 currentRotation,lastPosition;//鼠标滚轮控制缩放public float zoomSpeed = 10f;private float zoomDistance = 0f;private void Start(){currentRotation = transform.eulerAngles;}void Update(){// 使用WSAD控制相机前后左右移动比较简单,直接获取当前的移动方向,然后使用Translate移动即可{moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));transform.Translate(moveDirection * moveSpeed * Time.deltaTime);}//使用QE控制相机的上下,使用unDown参数进行单位变化{if (Input.GetKey(KeyCode.Q)){upDistance -= upSpeed * Time.deltaTime;transform.Translate(transform.up * upDistance, Space.World);}else if(Input.GetKeyUp(KeyCode.Q)){upDistance = 0;}if (Input.GetKey(KeyCode.E)){upDistance += upSpeed * Time.deltaTime;transform.Translate(transform.up * upDistance, Space.World);}else if(Input.GetKeyUp(KeyCode.E)){upDistance = 0;}}//使用鼠标右键来控制相机旋转//Mouse X,向右移动返回正值,Mouse Y,向上移动鼠标为正值{if (Input.GetMouseButtonDown(1)){// 记录当前的欧拉角//currentRotation = transform.eulerAngles;//记录鼠标位置lastPosition = Input.mousePosition;}if (Input.GetMouseButton(1)){//设置偏移量Vector3 offset = Input.mousePosition - lastPosition;rotateX += offset.x * sensitivity;rotateY -= offset.y * sensitivity;//给Y方向的旋转加上限值函数rotateY = Mathf.Clamp(rotateY, minAngle, maxAngle);//改变当前的欧拉角transform.eulerAngles = new Vector3(rotateY, rotateX, 0f);// 将保存的欧拉角重新赋值回去transform.eulerAngles += currentRotation;lastPosition = Input.mousePosition;}}//使用滚轮来控制物体的缩放{//获取滚轮的滚动幅度和方向zoomDistance += Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;//使用限值函数来限定缩放的范围zoomDistance = Mathf.Clamp(zoomDistance, -10f, 10f);//最后定位transform.position = transform.position + transform.forward * Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;}}
}

直接将代码复制,挂到Camera即可运行!

Unity相机自由移动脚本相关推荐

  1. Unity相机漫游脚本FreeCamera.CS

    Unity相机漫游脚本FreeCamera.CS

  2. Unity相机漫游脚本

    分享一个Unity中控制相机漫游的脚本,应用于智慧城市.数字孪生等场景操作. 直接上代码 using UnityEngine;[RequireComponent(typeof(Camera))] pu ...

  3. Unity SKFramework框架(十七)、FreeCameraController 上帝视角/自由视角相机控制脚本

    目录 一.简介 二.功能 1.键盘控制平移 2.鼠标控制平移 3.视角拉近拉远 4.绕视角中心旋转 5.视角聚焦 6.活动区域限制 7.闲置时绕视角中心旋转 三.核心变量 一.简介 FreeCamer ...

  4. 【Unity 题型】脚本开发

    知识涉及:Unity   脚本生命周期 要点 以下关于密封类的说法,正确的是 A. 密封类可以用做基类 B. 密封类可以使抽象类 C. 密封类永远不会有任何派生类 D. 密封类或密封方法可以重写或继承 ...

  5. Unity相机跟随以及子弹发射笔记

    相机移动 现在还有一个问题是:主角SpaceMarine移动的时候,会走出玩家的视线,所以这里让相机跟随着SpaceMarine移动. 步骤1. 创建和设置CameraMount 在层级(Hierar ...

  6. unity 关闭自己脚本_太可了!这些领域可以把Unity玩的那么好,带你开启新世界...

    projects 作品 本期编辑:刺子 审核:OF君 Unity3D凭借 操作简单.易学. 灵活等优势,风靡全球. 从官网最新公布的数据来看, 其已占世界范围内45%的市场份额, 占据全球首位. 如今 ...

  7. unity相机围绕模型转_围绕我们的业务模型和风险进行安全测试

    unity相机围绕模型转 When we create an environment and consider our security testing from development to pro ...

  8. Unity 相机固定角度平移至指定物体

    前言:这个也是我得一个朋友怎么做,朋友跟我说的方法,然后我就想记录下来,当个学习. 需求:相机固定视角(相机的高是15.x轴选转30.y轴旋转15),地图上有很多物体,点击后相机移动到指定物体(物体居 ...

  9. 【Unity3D】Android Studio 工程中使用 Java 代码调用 Unity 的 C# 脚本 ( Java 中调用 UnityPlayer#UnitySendMessage 方法 )

    文章目录 一. Java 调用 C# 依赖库准备 1.依赖库位置 2.unityLibrary 依赖库位置 二. Java 调用 C# 的 UnityPlayer#UnitySendMessage 方 ...

最新文章

  1. XML和实体类之间相互转换(序列化和反序列化)
  2. 【模板】一维树状数组
  3. python腐蚀膨胀代码_OpenCV+python实现膨胀和腐蚀的示例
  4. gitlab 的使用策略和简单介绍
  5. mysql where varchar_MySQL数据库之MySQL索引使用:字段为varchar类型时,条件要使用''包起来...
  6. 下载InstallShield Limited Edition for Visual Studio
  7. 致远SPM之CAP数据分析解决方案
  8. STAR、SMART、6W1H、PDCA原则
  9. 惯性导航技术, IMU, AHRS
  10. Odoo发邮件被服务器退回
  11. no algorithm found for: 08000000h - 0800275bhno algorithm found for: 08000000h - XXXXXXXXH
  12. 天池-金融风控训练营-task5-模型融合
  13. 星际2亚洲服务器 也就是韩服
  14. 哈夫曼树与哈夫曼编码及等长编码
  15. BeanUtils.populate()封装bean属性为null的四种失效原因
  16. 深度linux没有硬盘,安装Deepin系统到硬盘分区部分没有发现硬盘数据的解决
  17. Linux环境安装nodejs
  18. 2021年低压电工报名考试及低压电工模拟考试题库
  19. 蜗牛爬井——Erlang版本
  20. windows 10系统(64位或者32位)下使用Cisco Any Connect进行成功拨号

热门文章

  1. 重庆专科计算机系职业学校排名,重庆职业学校排名前十院校有哪些
  2. js代码 父页面调用子页面中的js方法,子页面调用父页面中的js方法
  3. 刘翔赛前曾接近12秒80 退赛意义大于10个栏架
  4. 2018团体程序设计天梯赛 软件学院选拔赛
  5. Java web图书管理系统——数据库课程设计
  6. 函数 void insert(char *s, char *t, int pos) 将字符串 t 插入到字符串 s 中,插入位置为 pos。请用 C 语言实现该函数。假设分配给字符串 s 的空间足够让
  7. python 分类变量转为哑变量_超级详细的特征哑变量处理
  8. online logo maker:在线制作具有专业水准的logo
  9. [Succeed]rEFind安装之在Deepin上的一番折腾~怀疑联想~Could not prepare Boot variable: No space left on device
  10. 国际版、个人家庭版onedrive如何开账号