Unity相机自由移动脚本
实现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相机自由移动脚本相关推荐
- Unity相机漫游脚本FreeCamera.CS
Unity相机漫游脚本FreeCamera.CS
- Unity相机漫游脚本
分享一个Unity中控制相机漫游的脚本,应用于智慧城市.数字孪生等场景操作. 直接上代码 using UnityEngine;[RequireComponent(typeof(Camera))] pu ...
- Unity SKFramework框架(十七)、FreeCameraController 上帝视角/自由视角相机控制脚本
目录 一.简介 二.功能 1.键盘控制平移 2.鼠标控制平移 3.视角拉近拉远 4.绕视角中心旋转 5.视角聚焦 6.活动区域限制 7.闲置时绕视角中心旋转 三.核心变量 一.简介 FreeCamer ...
- 【Unity 题型】脚本开发
知识涉及:Unity 脚本生命周期 要点 以下关于密封类的说法,正确的是 A. 密封类可以用做基类 B. 密封类可以使抽象类 C. 密封类永远不会有任何派生类 D. 密封类或密封方法可以重写或继承 ...
- Unity相机跟随以及子弹发射笔记
相机移动 现在还有一个问题是:主角SpaceMarine移动的时候,会走出玩家的视线,所以这里让相机跟随着SpaceMarine移动. 步骤1. 创建和设置CameraMount 在层级(Hierar ...
- unity 关闭自己脚本_太可了!这些领域可以把Unity玩的那么好,带你开启新世界...
projects 作品 本期编辑:刺子 审核:OF君 Unity3D凭借 操作简单.易学. 灵活等优势,风靡全球. 从官网最新公布的数据来看, 其已占世界范围内45%的市场份额, 占据全球首位. 如今 ...
- unity相机围绕模型转_围绕我们的业务模型和风险进行安全测试
unity相机围绕模型转 When we create an environment and consider our security testing from development to pro ...
- Unity 相机固定角度平移至指定物体
前言:这个也是我得一个朋友怎么做,朋友跟我说的方法,然后我就想记录下来,当个学习. 需求:相机固定视角(相机的高是15.x轴选转30.y轴旋转15),地图上有很多物体,点击后相机移动到指定物体(物体居 ...
- 【Unity3D】Android Studio 工程中使用 Java 代码调用 Unity 的 C# 脚本 ( Java 中调用 UnityPlayer#UnitySendMessage 方法 )
文章目录 一. Java 调用 C# 依赖库准备 1.依赖库位置 2.unityLibrary 依赖库位置 二. Java 调用 C# 的 UnityPlayer#UnitySendMessage 方 ...
最新文章
- XML和实体类之间相互转换(序列化和反序列化)
- 【模板】一维树状数组
- python腐蚀膨胀代码_OpenCV+python实现膨胀和腐蚀的示例
- gitlab 的使用策略和简单介绍
- mysql where varchar_MySQL数据库之MySQL索引使用:字段为varchar类型时,条件要使用''包起来...
- 下载InstallShield Limited Edition for Visual Studio
- 致远SPM之CAP数据分析解决方案
- STAR、SMART、6W1H、PDCA原则
- 惯性导航技术, IMU, AHRS
- Odoo发邮件被服务器退回
- no algorithm found for: 08000000h - 0800275bhno algorithm found for: 08000000h - XXXXXXXXH
- 天池-金融风控训练营-task5-模型融合
- 星际2亚洲服务器 也就是韩服
- 哈夫曼树与哈夫曼编码及等长编码
- BeanUtils.populate()封装bean属性为null的四种失效原因
- 深度linux没有硬盘,安装Deepin系统到硬盘分区部分没有发现硬盘数据的解决
- Linux环境安装nodejs
- 2021年低压电工报名考试及低压电工模拟考试题库
- 蜗牛爬井——Erlang版本
- windows 10系统(64位或者32位)下使用Cisco Any Connect进行成功拨号
热门文章
- 重庆专科计算机系职业学校排名,重庆职业学校排名前十院校有哪些
- js代码 父页面调用子页面中的js方法,子页面调用父页面中的js方法
- 刘翔赛前曾接近12秒80 退赛意义大于10个栏架
- 2018团体程序设计天梯赛 软件学院选拔赛
- Java web图书管理系统——数据库课程设计
- 函数 void insert(char *s, char *t, int pos) 将字符串 t 插入到字符串 s 中,插入位置为 pos。请用 C 语言实现该函数。假设分配给字符串 s 的空间足够让
- python 分类变量转为哑变量_超级详细的特征哑变量处理
- online logo maker:在线制作具有专业水准的logo
- [Succeed]rEFind安装之在Deepin上的一番折腾~怀疑联想~Could not prepare Boot variable: No space left on device
- 国际版、个人家庭版onedrive如何开账号