今天跟着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种方法实现摄像机的移动,旋转,放缩相关推荐

  1. [Unity]角色头顶血条的实现的几种方法以及优化拓展

    1.UGUI 的 Image 1.1biliboard广告板中使用update函数 1.1.1在角色头顶的血条 参考资料2,biliboard广告板中使用update函数.如果场景中含有update函 ...

  2. Unity的几种移动和旋转方法

    Unity的几种移动和旋转方法 Unity的移动 基础框架 匀速移动 变速移动 自定义变速运动 最终代码: Unity的几种旋转方法 Unity的移动 在制作一款游戏的时候,经常需要对物体的位置进行移 ...

  3. Unity中打开文件窗口(OpenFileDialog)的几种方法对比

    1 概述 本文链接:http://blog.csdn.net/ithot/article/details/76997237 用Unity以来,一直都没怎么关注过打开对话框去选取本地文件,最近需要用到这 ...

  4. Unity镜头跟踪的四种方法

    Unity镜头跟踪的四种方法 新手代码 固定相机跟随,这种相机有一个参考对象,它会保持与该参考对象固定的位置,跟随改参考对象发生移动 using UnityEngine; using System.C ...

  5. unity中控制游戏物体移动最基本的三种方法

    **unity**中控制游戏物体移动的最基本的三种方法 第一种移动方法-transform.Translate,游戏物体按照你给的方向和速度进行运动 代码如下: Public float speed; ...

  6. unity 2D游戏开发 制作帧动画的两种方法

    本小主在这里给大家分享一下unity 2D游戏开发中制作帧动画的两种方法. 比较简单,一学即会. 方法一: 是用代码控制: 先创建一个2D工程.导入图片资源,并设置texture的texture ty ...

  7. Unity Android 之 应用打开手机的指定网页浏览器(external browser)的两种方法(封装aar和不用封装aar方法)

    Unity Android 之 应用打开手机的指定网页浏览器(external browser)的两种方法(封装aar和不用封装aar方法) 目录 Unity Android 之 应用打开手机的指定网 ...

  8. Unity 得到游戏组件的常用的两种方法

    看了一些别人总结的得到组件的方法,很详细,但是初学者会看得眼花缭乱(我就是),这里给出最常用的得到游戏组件的两种方法.这里都以MeshRenderer 组件为例 1.当脚本挂在当前游戏物体,需要得到当 ...

  9. 为什么安监控需要公网ip_三种方法告诉你项目超过255个摄像机怎么设置IP?

    原标题:三种方法告诉你项目超过255个摄像机怎么设置IP? 我们做弱电的,与ip地址接触最多,无论是弱电的哪方面,都需要跟ip地址打交道,通常我们也会经常听到公网.内网?那什么是公网ip地址呢?什么是 ...

最新文章

  1. java继承和多态的实验报告_JAVA,继承和多态实验报告
  2. 如何获取并操作listview中的控件
  3. 执行Hive的查询语句报错:java.lang.IllegalArgumentException: Does not contain a valid host:port authority: loca
  4. html5 对比 HTML4 新增,HTML5对比HTML4的主要改变和改进总结
  5. Bucket不为空,请检查该Bucket是否包含未删除的Object或者未成功的Multipart碎片
  6. 虚拟环境安装python3
  7. 【转】做一名开源社区的扫地僧 (上)
  8. Eclipse 中如何设置字体大小与样式
  9. 企业框架源码 SpringMVC mybatis ehcache shiro maven
  10. ajax 解析gzip,javascript – 如何让浏览器gunzip一个Ajax获取gziped文本文件?
  11. 帮你解决0xc0150002
  12. 安卓手机如何防盗_如何使用IMEI号码追踪丢失的安卓(Android)手机
  13. python平方数_python数字平方
  14. C#支付宝扫码支付代码完整版(转)
  15. Ruby中的类和模块和变量使用说明
  16. 2023新年快乐,友盟+伴你岁岁年年
  17. VR购物为实体零售开启科技助力
  18. R语言无法从GitLAB/GITHUB远程安装
  19. Silverlight Spy初探
  20. 纽曼A15 连接电视 配置

热门文章

  1. 微风:新手必看PS实用技巧大全
  2. 论文笔记--Evaluating Large Language Models Trained on Code
  3. Windows 核心编程研究系列之二 读取指定物理内存地址中的内容
  4. liboqs-量子安全密码算法开源C库
  5. 数据结构(二)栈和队列(模板实现)
  6. QQ阅读器技术框架解析之一《代码预览和分析》
  7. CPM-main 部署实践 AI生成小说3
  8. Danger is My Middle Name – Experimenting with SSL Vulnerabilities in Android Apps 阅读笔记
  9. 【Ubuntu】Ubuntu16.04下WPS演示闪退
  10. tm影像辐射定标_【转】Landsat TM 辐射定标和大气校正步骤