说明

  上一篇记录了PC端鼠标控制摄像机的移动和缩放,这一篇写的是在安卓机上实现手势控制摄像机围绕一个物体进行旋转和缩放,两篇的代码逻辑基本一样只是输入检测有区别,这里我是分开记录,没有整合【Unity实现PC端鼠标控制摄像机的移动和缩放】,使用的方式也很简单,将脚本挂载到主摄像机中。

  这里还用到了DoTween的插件和UniRx,需要自己导入一下,如果不想使用插件,可以把以下代码简单修改一下。

using UnityEngine;
using DG.Tweening;
using UnityEngine.EventSystems;
using QFramework;
using UniRx;
using UniRx.Triggers;
/// <summary>
/// 摄像机控制管理
/// </summary>
public class CameraController : MonoBehaviour
{static CameraController _instance;public static CameraController Ins{get { return _instance; }}Transform cam_TF;// 是否可以控制摄像机public bool isCanControlCam = true;[Header("旋转的目标点:")]public Transform rotTarget;[Header("相机点击UI前进和返回的速度")]public float cameraMoveSpeed = 400f;[Header("旋转速度和缩放速度:")]public float rotateSpeed = 1.25f;public float wheelSpeed = 100f;[Header("摄像机的最远距离和最近距离:")]public float minDist = 3;public float maxDist = 60;[Header("最大俯仰角:")]public float maxAngle;[Header("最小俯仰角:")]public float minAngle;// 当前摄像机俯仰角public float nowCamEulerX;Vector3 initPos;void Awake(){_instance = this;cam_TF = Camera.main.transform;}void Start(){cam_TF.LookAt(rotTarget);initPos = cam_TF.localPosition;nowCamEulerX = cam_TF.localEulerAngles.x;this.LateUpdateAsObservable().Subscribe(_ => {if (!isCanControlCam)return;CameraRotate();CameraFOV();});}/// <summary>/// 摄像机的初始位置/// </summary>public void CamMoveInitPos(){if (!isCanControlCam)return;this.Sequence().Event(() =>{isCanControlCam = false;mouseLerpPos = Vector2.zero;cam_TF.DORotate(new Vector3(25, -44, 0), 1f);cam_TF.DOMove(initPos, 1f);}).Delay(1.05f).Event(() =>{isCanControlCam = true;nowCamEulerX = cam_TF.localEulerAngles.x;}).Begin();}#region 鼠标操作Vector2 mousePos;Vector2 mouseLerpPos;/// <summary>/// 摄像机旋转/// </summary>void CameraRotate(){if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved&& !EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)){mousePos.x = Input.GetAxis("Mouse X");mousePos.y = Input.GetAxis("Mouse Y");if (Input.touchCount==1 && !EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)){mouseLerpPos.x = Mathf.Lerp(mouseLerpPos.x, mousePos.x, 5 * Time.deltaTime);mouseLerpPos.y = Mathf.Lerp(mouseLerpPos.y, mousePos.y, 5 * Time.deltaTime);}else{mouseLerpPos.x = Mathf.Lerp(mouseLerpPos.x, 0, 5 * Time.deltaTime);mouseLerpPos.y = Mathf.Lerp(mouseLerpPos.y, 0, 5 * Time.deltaTime);}cam_TF.RotateAround(rotTarget.position, Vector3.up, mouseLerpPos.x * rotateSpeed);nowCamEulerX -= mouseLerpPos.y * rotateSpeed;if (nowCamEulerX > maxAngle || nowCamEulerX < minAngle){nowCamEulerX += mouseLerpPos.y * rotateSpeed;mouseLerpPos.y = 0;return;}if (Mathf.Abs(-mouseLerpPos.y * rotateSpeed) < 0.02f)return;cam_TF.RotateAround(rotTarget.position, cam_TF.right, -mouseLerpPos.y * rotateSpeed * 0.5f);}}float wheelValue;float wheelTargetValue;Touch oldTouch1;Touch oldTouch2;/// <summary>/// 摄像机缩放  /// </summary>void CameraFOV(){if (Input.touchCount>1){Touch newTouch1 = Input.GetTouch(0);Touch newTouch2 = Input.GetTouch(1);if (newTouch2.phase== TouchPhase.Began){oldTouch1 = newTouch1;oldTouch2 = newTouch2;wheelTargetValue = 0;return;}if (newTouch1.phase==TouchPhase.Moved||newTouch2.phase==TouchPhase.Moved){float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);if ((newDistance - oldDistance) < 0)wheelValue = -0.15f;else if ((newDistance - oldDistance) > 0)wheelValue = 0.15f;if (Vector3.Distance(cam_TF.position, rotTarget.position) < minDist && wheelValue > 0)return;if (Vector3.Distance(cam_TF.position, rotTarget.position) > maxDist && wheelValue < 0)return;wheelTargetValue = Mathf.Lerp(wheelTargetValue, wheelValue, 5 * Time.deltaTime);cam_TF.Translate(Vector3.forward * wheelTargetValue * wheelSpeed);}}}#endregion
}

Unity实现安卓端手势控制摄像机的旋转和缩放相关推荐

  1. Unity 触屏手势控制Camera平移旋转缩放

    Unity 触屏手势控制Camera平移旋转缩放 实现思路 单点触屏,位移增量控制相机平移: 两点触屏,两点位移控制相机前后移动(缩放):两点中一点不位移控制相机绕点旋转: 实现需要的API Touc ...

  2. Unity 用于控制摄像机的旋转、远近

    /// <summary> /// 用于控制摄像机的旋转.远近 /// </summary> public class CameraTransform : MonoBehavi ...

  3. Python之OpenGL笔记(17):键盘鼠标控制摄像机移动旋转

    一.目的 1.键盘控制摄像机自由移动: 2.鼠标控制摄像机旋转: 3.鼠标滚轮放大缩小视野. 二.程序运行结果 三.自由移动 view = lookAt(cameraPos, cameraPos + ...

  4. 【Unity开发小技巧】模型单指旋转双指缩放功能代码(多种情况)

    欢迎加入Unity业内qq交流群:956187480 qq扫描二维码加群 1.pc端通过鼠标中键调整相机的FieldOfView属性的值(会发生形变不建议) void Update(){if (Inp ...

  5. Android matrix 控制图片的旋转、缩放、移动

    本文主要讲解利用android中Matrix控制图形的旋转缩放移动,具体参见一下代码: /** * 使用矩阵控制图片移动.缩放.旋转 * @author 张进 */ public class Comm ...

  6. android matrix 实现点击旋转,Android中利用matrix 控制图片的旋转、缩放、移动

    本文主要讲解利用android中Matrix控制图形的旋转缩放移动,具体参见一下代码: /** * 使用矩阵控制图片移动.缩放.旋转 */ public class CommonImgEffectVi ...

  7. Unity手势控制物体球形旋转

    目的:当我想让物体绕Y轴旋转时,无论他当前的朝向都可以绕绝对Y轴转,同理X轴,Z轴.同时不可以有万向锁. 原理:当我们物体绕轴旋转时,其实是矩阵相乘,所以我们需要先算出当前要旋转角度的旋转矩阵,代码如 ...

  8. 使用Vitamio打造自己的Android万能播放器(2)—— 手势控制亮度、音量、缩放

    前言 本章继续完善播放相关播放器的核心功能,为后续扩展打好基础. 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over1 ...

  9. 使用Vitamio打造自己的Android万能播放器—— 手势控制亮度、音量、缩放

    使用Vitamio打造自己的Android万能播放器(1)--准备 一.实现目标 1.1亮度控制 模仿VPlayer界面: 1.2声音控制 模仿VPlayer界面: 1.3画面缩放 根据下面API ...

最新文章

  1. 在Winform中播放视频等【DotNet,C#】
  2. 彻底卸载nodejs和npm然后使用nvm
  3. discuz修改用户uid_你知道Linux中的UID和GID的含义吗
  4. 即将举行的网络研讨会:调试生产中Java的5种最佳实践
  5. ASP.NET Core的身份认证框架IdentityServer4--入门【转】
  6. 【C语言】利用递归函数求n的阶乘
  7. 1.12 深层循环神经网络
  8. 7 win 卸载node_如何从windows中完全删除node.js_windows彻底卸载node教程
  9. node -v 突然显示 killed 9 处理历程
  10. win10 nginx文件服务器,Windows10下 FFmpeg + Nginx 的 rtmp 服务器搭建
  11. layui 弹窗自适应高度_layui弹框自适应高度
  12. kaggle Titanic泰坦尼克
  13. 软件介绍——SyncToy 微软官方文件同步工具
  14. (MATLAB)大家来找茬-简易的彩色图像找不同
  15. 织梦模板:用织梦建站的五大好处
  16. 个人云存储的两大强者比拼 百度云VS苹果iCloud
  17. Bilibili弹幕文件参数
  18. 2022新版海螺影视主题模板M3.1版本多功能苹果CMSv10后台自适应模板详解
  19. windows中的一些小技巧
  20. HTML学习笔记(实体+meta标签+块、行内元素+语义化标签+布局标签)

热门文章

  1. 快速免费搭建属于自己的网站
  2. 厦门大学计算机应用基础考试题,厦门大学2016计算机应用基础复习题
  3. Android 杀后台太狠,谷歌:看不下去了,势必要揪出“凶手”!
  4. 搜狗高速浏览器2.2
  5. IDesign C#编码规范(五)
  6. 为什么 CSS 动画比 JavaScript 高效?
  7. Punte 多功能免费WordPress主题
  8. iShowU Studio for Mac(高清录屏工具)
  9. 说说王者荣耀手游受欢迎的原因
  10. Log4j自定义Appender