【Unity】通过2种方法实现摄像机的移动,旋转,放缩
今天跟着Joe老师学习了在3D场景中进行场景移动的两种方法
摄像机移动方法
- 最基本的移动方式
- 通过GetAxisRaw实现摄像机的水平移动
- 在鼠标移动至界面边缘时也会移动:
- 设定相机移动的范围
- 方法一(通过键盘交互)
- Lerp
- Quaternion .Euler(四元数 欧拉)
- V3.up
- V3.down
- 方法二
最基本的移动方式
通过GetAxisRaw实现摄像机的水平移动
moveInput.Set(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
在鼠标移动至界面边缘时也会移动:
if (mousePos.x > Screen.width * 0.9f && mousePos.x < Screen.width)moveInput.x = 1;if (mousePos.x < Screen.width * 0.1f && mousePos.x > 0)moveInput.x = -1;if (mousePos.y > Screen.height * 0.9f && mousePos.y < Screen.height)moveInput.z = 1;if (mousePos.y < Screen.height * 0.1f && mousePos.y > 0)moveInput.z = -1;
设定相机移动的范围
//相机的范围pos.x = Mathf.Clamp(pos.x, -10, 10);pos.y = Math.Clamp(pos.y, 5, 30);pos.z = Math.Clamp(pos.z, -25, 5);transform.position = pos;
以下方法都是通过父级挂载子级的摄像机进行交互
方法一(通过键盘交互)
水平移动
//通过4个方向键进行水平移动if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W)){newPos += transform.forward * panSpeed * Time.deltaTime;}if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S)){newPos -= transform.forward * panSpeed * Time.deltaTime;}if (Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D)){newPos += transform.right * panSpeed * Time.deltaTime;}if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A)){newPos -= transform.right * panSpeed * Time.deltaTime;}
旋转
//Q,E进行旋转if (Input.GetKey(KeyCode.Q)){Debug.Log("Q");newRotation *= Quaternion.Euler(Vector3.up * rotationAmount);}if (Input.GetKey(KeyCode.E)){Debug.Log("E");newRotation *= Quaternion.Euler(Vector3.down * rotationAmount);}
放缩
//R,F 进行放缩if (Input.GetKey(KeyCode.R)){Debug.Log("R");newZoom += zoomAmount;}if (Input.GetKey(KeyCode.F)){Debug.Log("F");newZoom -= zoomAmount;}
执行完这些代码后记得将变化过参数重新赋值给gameobj
transform.position = Vector3.Lerp(transform.position, newPos, moveTime * Time.deltaTime);transform.rotation = Quaternion.Lerp(transform.rotation, newRotation, moveTime * Time.deltaTime);cameraTrans.localPosition = Vector3.Lerp(cameraTrans.localPosition, newZoom, moveTime * Time.deltaTime);
Lerp
通过差值函数将值的变化进行缓冲
但是 插值只能在[0,1]之间
Quaternion .Euler(四元数 欧拉)
V3.up
V3.down
方法二
鼠标交互
主要是通过点击与拖动之间的差值进行位移
private void HandleMouseInput(){if (Input.GetMouseButtonDown(1)){Plane plane = new Plane(Vector3.up,Vector3.zero);float distance;Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);if (plane.Raycast(ray, out distance)){dragStartPos = ray.GetPoint(distance);}}if (Input.GetMouseButton(1)){Plane plane = new Plane(Vector3.up,Vector3.zero);float distance;Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);if (plane.Raycast(ray, out distance)){dragCurrentPos = ray.GetPoint(distance);Vector3 difference = dragStartPos - dragCurrentPos;newPos = transform.position +difference;}}newZoom += Input.mouseScrollDelta.y * zoomAmount;if (Input.GetMouseButtonDown(2)){rotateStart = Input.mousePosition;}if (Input.GetMouseButton(2)){RotateCurrent = Input.mousePosition;Vector3 difference = rotateStart - RotateCurrent;rotateStart = RotateCurrent;newRotation *= quaternion.Euler(Vector3.up * -difference.x/320 );}}
【Unity】通过2种方法实现摄像机的移动,旋转,放缩相关推荐
- [Unity]角色头顶血条的实现的几种方法以及优化拓展
1.UGUI 的 Image 1.1biliboard广告板中使用update函数 1.1.1在角色头顶的血条 参考资料2,biliboard广告板中使用update函数.如果场景中含有update函 ...
- Unity的几种移动和旋转方法
Unity的几种移动和旋转方法 Unity的移动 基础框架 匀速移动 变速移动 自定义变速运动 最终代码: Unity的几种旋转方法 Unity的移动 在制作一款游戏的时候,经常需要对物体的位置进行移 ...
- Unity中打开文件窗口(OpenFileDialog)的几种方法对比
1 概述 本文链接:http://blog.csdn.net/ithot/article/details/76997237 用Unity以来,一直都没怎么关注过打开对话框去选取本地文件,最近需要用到这 ...
- Unity镜头跟踪的四种方法
Unity镜头跟踪的四种方法 新手代码 固定相机跟随,这种相机有一个参考对象,它会保持与该参考对象固定的位置,跟随改参考对象发生移动 using UnityEngine; using System.C ...
- unity中控制游戏物体移动最基本的三种方法
**unity**中控制游戏物体移动的最基本的三种方法 第一种移动方法-transform.Translate,游戏物体按照你给的方向和速度进行运动 代码如下: Public float speed; ...
- unity 2D游戏开发 制作帧动画的两种方法
本小主在这里给大家分享一下unity 2D游戏开发中制作帧动画的两种方法. 比较简单,一学即会. 方法一: 是用代码控制: 先创建一个2D工程.导入图片资源,并设置texture的texture ty ...
- Unity Android 之 应用打开手机的指定网页浏览器(external browser)的两种方法(封装aar和不用封装aar方法)
Unity Android 之 应用打开手机的指定网页浏览器(external browser)的两种方法(封装aar和不用封装aar方法) 目录 Unity Android 之 应用打开手机的指定网 ...
- Unity 得到游戏组件的常用的两种方法
看了一些别人总结的得到组件的方法,很详细,但是初学者会看得眼花缭乱(我就是),这里给出最常用的得到游戏组件的两种方法.这里都以MeshRenderer 组件为例 1.当脚本挂在当前游戏物体,需要得到当 ...
- 为什么安监控需要公网ip_三种方法告诉你项目超过255个摄像机怎么设置IP?
原标题:三种方法告诉你项目超过255个摄像机怎么设置IP? 我们做弱电的,与ip地址接触最多,无论是弱电的哪方面,都需要跟ip地址打交道,通常我们也会经常听到公网.内网?那什么是公网ip地址呢?什么是 ...
最新文章
- java继承和多态的实验报告_JAVA,继承和多态实验报告
- 如何获取并操作listview中的控件
- 执行Hive的查询语句报错:java.lang.IllegalArgumentException: Does not contain a valid host:port authority: loca
- html5 对比 HTML4 新增,HTML5对比HTML4的主要改变和改进总结
- Bucket不为空,请检查该Bucket是否包含未删除的Object或者未成功的Multipart碎片
- 虚拟环境安装python3
- 【转】做一名开源社区的扫地僧 (上)
- Eclipse 中如何设置字体大小与样式
- 企业框架源码 SpringMVC mybatis ehcache shiro maven
- ajax 解析gzip,javascript – 如何让浏览器gunzip一个Ajax获取gziped文本文件?
- 帮你解决0xc0150002
- 安卓手机如何防盗_如何使用IMEI号码追踪丢失的安卓(Android)手机
- python平方数_python数字平方
- C#支付宝扫码支付代码完整版(转)
- Ruby中的类和模块和变量使用说明
- 2023新年快乐,友盟+伴你岁岁年年
- VR购物为实体零售开启科技助力
- R语言无法从GitLAB/GITHUB远程安装
- Silverlight Spy初探
- 纽曼A15 连接电视 配置
热门文章
- 微风:新手必看PS实用技巧大全
- 论文笔记--Evaluating Large Language Models Trained on Code
- Windows 核心编程研究系列之二 读取指定物理内存地址中的内容
- liboqs-量子安全密码算法开源C库
- 数据结构(二)栈和队列(模板实现)
- QQ阅读器技术框架解析之一《代码预览和分析》
- CPM-main 部署实践 AI生成小说3
- Danger is My Middle Name – Experimenting with SSL Vulnerabilities in Android Apps 阅读笔记
- 【Ubuntu】Ubuntu16.04下WPS演示闪退
- tm影像辐射定标_【转】Landsat TM 辐射定标和大气校正步骤