unity3d相机拖拽移动脚本,结合easyTouch,不提供easyTouch插件,此脚本需easyTouch5支持,下载easyTouch后把脚本放到工程即可,然后按下面的图示例就可以了

相机组件层级设置.gif

using UnityEngine;
using HedgehogTeam.EasyTouch;
/// <summary>
/// 相机拖拽
/// </summary>
public class CameraManager : MonoBehaviour
{public static CameraManager Instance;public float OriginDistance { get; private set; }public Transform CameraRoot{get{if (CameraRoot_ == null)CameraRoot_ = GameObject.Find("MainCamera").transform;return CameraRoot_;}}public GameObject WorldCameraObj{get{if (WorldCameraObj_ == null)WorldCameraObj_ = GameObject.Find("WorldCamera").gameObject;return WorldCameraObj_;}}public Camera WorldCamera{get{if (WorldCamera_ == null){WorldCamera_ = WorldCameraObj.GetComponent<Camera>();}return WorldCamera_;}}private Transform CameraRoot_;private GameObject WorldCameraObj_;private Camera WorldCamera_;// 缩放视口边界限制private float MinDistance = 20f;private float MaxDistance = 110;// 边界限制private RangeAttribute BoundX;private RangeAttribute BoundZ;public Vector2 BoundaryX;public Vector2 BoundaryZ;// 拖拽移动速度public float MoveSpeed = 10f;private Vector3 TargetPos;private Vector3 EulerAngles;public delegate void CameraOpreateHandler(Gesture gesture);public delegate bool CameraDragHandler(Gesture gesture);public delegate void CameraHandler();public event CameraOpreateHandler On_SwipeStart;public event CameraOpreateHandler On_Swipe;public event CameraHandler On_SwipeCamera;public event CameraOpreateHandler On_Pinch;public event CameraOpreateHandler On_Twist;public event CameraOpreateHandler On_SimpleTap;public event CameraOpreateHandler On_TouchUp;public event CameraOpreateHandler On_LongTapStart;public event CameraOpreateHandler On_LongTap;public event CameraOpreateHandler On_LongTapEnd;public event CameraDragHandler CheckCameraCanDrag;private void Awake(){Instance = this;OriginDistance = GetCameraDistance();TargetPos = CameraRoot.position;EulerAngles = CameraRoot.eulerAngles;EasyTouch.On_Pinch += EasyTouch_On_Pinch;EasyTouch.On_PinchEnd += EasyTouch_On_PinchEnd;EasyTouch.On_PinchIn += EasyTouch_On_PinchIn;EasyTouch.On_PinchOut += EasyTouch_On_PinchOut;EasyTouch.On_Twist += EasyTouch_On_Twist;EasyTouch.On_TwistEnd += EasyTouch_On_TwistEnd;EasyTouch.On_DragStart += EasyTouch_On_DragStart;EasyTouch.On_SwipeStart += EasyTouch_On_SwipeStart;EasyTouch.On_Drag += EasyTouch_On_Drag;EasyTouch.On_Swipe += EasyTouch_On_Swipe;EasyTouch.On_SimpleTap += EasyTouch_On_SimpleTap;EasyTouch.On_TouchUp += EasyTouch_On_TouchUp;EasyTouch.On_SimpleTap += OnSimpleTap;InitWorldCamera();}private void OnDestroy(){EasyTouch.On_PinchEnd -= EasyTouch_On_PinchEnd;EasyTouch.On_PinchIn -= EasyTouch_On_PinchIn;EasyTouch.On_PinchOut -= EasyTouch_On_PinchOut;EasyTouch.On_Twist -= EasyTouch_On_Twist;EasyTouch.On_TwistEnd -= EasyTouch_On_TwistEnd;EasyTouch.On_DragStart -= EasyTouch_On_DragStart;EasyTouch.On_SwipeStart -= EasyTouch_On_SwipeStart;EasyTouch.On_Drag -= EasyTouch_On_Drag;EasyTouch.On_Swipe -= EasyTouch_On_Swipe;EasyTouch.On_SimpleTap -= EasyTouch_On_SimpleTap;EasyTouch.On_TouchUp -= EasyTouch_On_TouchUp;EasyTouch.On_SimpleTap -= OnSimpleTap;}// 点击private void OnSimpleTap(Gesture gesture){if (gesture.pickedObject)Debug.LogError(gesture.pickedObject.name);}private Camera CurCamera;private void EasyTouch_On_PinchIn(Gesture gesture){EasyTouch.SetEnableTwist(false);if (CurCamera == null)CurCamera = WorldCameraObj.GetComponent<Camera>();if (CurCamera.orthographicSize >= 30)return;CurCamera.orthographicSize++;float v = 5 * (CurCamera.orthographicSize / 10 - 1);BoundX = new RangeAttribute(-20 + -v, 20 + v);BoundZ = new RangeAttribute(-15 + -v, 15 + v);}private void EasyTouch_On_PinchOut(Gesture gesture){EasyTouch.SetEnableTwist(false);if (CurCamera == null)CurCamera = WorldCameraObj.GetComponent<Camera>();if (CurCamera.orthographicSize <= 10)return;CurCamera.orthographicSize--;}/// <summary>/// 缩放/// </summary>/// <param name="gesture"></param>private void EasyTouch_On_Pinch(Gesture gesture){EasyTouch.SetEnableTwist(false);// 直接改变视口来缩放//Camera.main.fieldOfView += gesture.deltaPinch * Time.deltaTime;// 考虑到视口变太大 画面扭曲的关系,所以改成根据朝向修改坐标来完成缩放Vector3 pos = WorldCameraObj.transform.position + WorldCameraObj.transform.forward * (gesture.deltaPinch * Time.deltaTime * 10f / ((float)Screen.width / (float)Screen.height));// 缩放距离限制float distance = Vector3.Distance(CameraRoot_.position, pos);if (distance < MinDistance || distance > MaxDistance)return;WorldCameraObj.GetComponent<Camera>().orthographicSize = distance;WorldCameraObj.transform.position = pos;WorldCameraObj.transform.position = new Vector3(WorldCameraObj.transform.position.x, pos.y, WorldCameraObj.transform.position.z);if (On_Pinch != null)On_Pinch(gesture);}private void EasyTouch_On_PinchEnd(Gesture gesture){EasyTouch.SetEnableTwist(true);}/// <summary>/// 旋转/// </summary>/// <param name="gesture"></param>private void EasyTouch_On_Twist(Gesture gesture){EasyTouch.SetEnablePinch(false);CameraRoot.Rotate(Vector3.up * gesture.twistAngle);if (On_Twist != null)On_Twist(gesture);}void EasyTouch_On_TwistEnd(Gesture gesture){//EasyTouch.SetEnablePinch( true );}/// <summary>/// 开始拖/// </summary>/// <param name="gesture"></param>private void EasyTouch_On_DragStart(Gesture gesture){EasyTouch_On_SwipeStart(gesture);}/// <summary>/// 开始划/// </summary>/// <param name="gesture"></param>private void EasyTouch_On_SwipeStart(Gesture gesture){if (On_SwipeStart != null)On_SwipeStart(gesture);}/// <summary>/// 拖/// </summary>/// <param name="gesture"></param>private void EasyTouch_On_Drag(Gesture gesture){// Debug.LogError( "moveing" );EasyTouch_On_Swipe(gesture);}/// <summary>/// 划/// </summary>/// <param name="gesture"></param>private void EasyTouch_On_Swipe(Gesture gesture){if (CheckCameraCanDrag != null){if (!CheckCameraCanDrag(gesture)){// 如果不能拖相机,那么触发该回调,通知其它模块触发了拖动if (On_Swipe != null)On_Swipe(gesture);return;}}float rate = Vector3.Distance(WorldCameraObj.transform.position, CameraRoot.transform.position);Vector3 pos = CameraRoot.transform.position;pos -= (CameraRoot.transform.right * gesture.deltaPosition.x / (float)Screen.width * rate * MoveSpeed);pos -= (CameraRoot.transform.forward * gesture.deltaPosition.y / (float)Screen.height * rate * MoveSpeed);// 边界限制if (pos.x <= (BoundX.min) || pos.x >= (BoundX.max)){return;}if (pos.z <= (BoundZ.min) || pos.z >= (BoundZ.max)){return;}TargetPos = pos;}/// <summary>/// 点击/// </summary>/// <param name="gesture"></param>private void EasyTouch_On_SimpleTap(Gesture gesture){if (On_SimpleTap != null)On_SimpleTap(gesture);}/// <summary>/// 释放/// </summary>/// <param name="gesture"></param>private void EasyTouch_On_TouchUp(Gesture gesture){if (On_TouchUp != null)On_TouchUp(gesture);}private void FixedUpdate(){if (Vector3.Distance(CameraRoot.position, TargetPos) > 0.1f){CameraRoot.position = Vector3.Lerp(CameraRoot.transform.position, TargetPos, Time.deltaTime * 10f);if (On_SwipeCamera != null)On_SwipeCamera();}else{if (updateCamera != null){updateCamera();updateCamera = null;}}if (Vector3.Distance(CameraRoot.eulerAngles, EulerAngles) > 0.1f){Quaternion temp = new Quaternion();temp.eulerAngles = EulerAngles;CameraRoot.rotation = Quaternion.RotateTowards(CameraRoot.rotation, temp, Time.deltaTime * 50f);}}/// <summary>/// 设置触摸是否可用/// </summary>/// <param name="b"></param>public static void SetTouchActive(bool b){EasyTouch.SetEnabled(b);}public float GetCameraDistance(){return Vector3.Distance(CameraRoot.position, WorldCameraObj.transform.position);}public void InitWorldCamera(){TargetPos = new Vector3(0, 0, 0);CameraRoot.position = TargetPos;EulerAngles = new Vector3(0, 0, 0);CameraRoot_.eulerAngles = EulerAngles;WorldCamera.fieldOfView = 30f;WorldCamera.farClipPlane = 50000;WorldCameraObj.transform.localPosition = new Vector3(0, 25f, 0);WorldCameraObj.transform.localEulerAngles = new Vector3(65f, 0, 0);BoundX = new RangeAttribute(BoundaryX.x, BoundaryX.y);BoundZ = new RangeAttribute(BoundaryZ.x, BoundaryZ.y);}/// <summary>/// 摄像机跳转到指定坐标/// </summary>/// <param name="pos"></param>/// <param name="callback"></param>public void MoveCameraToPosition(Vector3 pos, CameraHandler callback = null){// 需要注意跳转目标坐标如果超出边界限制的话需要跳转目标坐标的指定方向最大值Vector3 temp = pos;if (pos.x <= BoundX.min)temp.x = BoundX.min;if (pos.x >= BoundX.max)temp.x = BoundX.max;if (pos.z <= BoundZ.min)temp.z = BoundZ.min;if (pos.z >= BoundZ.max)temp.z = BoundZ.max;TargetPos.x = temp.x;TargetPos.z = temp.z;updateCamera += callback;}private event CameraHandler updateCamera;public void SetTargetPOS(Vector3 pos){TargetPos.x = pos.x;TargetPos.z = pos.z;}
}

unity3d EasyTouch滑动屏幕移动相机观看场景相关推荐

  1. 【Android】11.3 屏幕旋转和场景变换过程中GridView的呈现

    分类:C#.Android.VS2015: 创建日期:2016-02-21 一.简介 实际上,对于布局文件中的View来说,大多数情况下,Android都会自动保存这些状态,并不需要我们都去处理它.这 ...

  2. airtest获取设备号和获取设备宽度、高度、绝对坐标 相对坐标、滑动屏幕

    def setup_function():# 连接当前设备# HUAWEI honor 10 分辨率:2280*1080# OPPO R15 分辨率:2280*1080# Vivo x21 分辨率:2 ...

  3. 开发板Linux手指滑动方向,移动应用滑动屏幕方向判断解决方案,JS判断手势方向...

    问题分类 滑动屏幕打开相应功能操作. 问题描述 1.用户手动滑动屏幕,根据滑动的方向,打开相应的功能(如:向上滑摇钱树经验明细,向下滑打开任务明细,向左滑打开聚宝盆物品查看等功能),滑动事件捕获问题. ...

  4. 安卓自动滑屏脚本_定时滑动屏幕工具脚本下载-定时上下滑动屏幕工具(手机模拟)软件下载v3.1-单游网...

    定时滑动屏幕工具,冬天来了,气温那么低,喜欢用手机看短视频的朋友们会发现,气温低,导致手根本不想拿出来滑动屏幕,但是又想看视频,怎么办呢?你可以试试这款定时滑动屏幕的软件,从此再也不用手动滑动屏幕了, ...

  5. android自动滑屏解锁,如何删除/绕过滑动屏幕以解锁Android设备-万兴恢复专家

    如今,几乎所有数字设备都启用了安全模式,我们的智能手机就是这种情况.此类实例高度计划用于锁定我们的消息,图库,电子邮件和其他个人存储.使用锁定模式增强了安全性,因此,除了设备的已知用户之外,未知的人无 ...

  6. Java-Appium封装实现滑动屏幕效果

    ** Java-Appium封装实现滑动屏幕效果 1.在客户端自动化测试过程中常常需要滑动屏幕,常见做法是自己手动传入xy滑动屏幕,一般是通过手机屏幕的大小进行一些计算后实现上下左右滑动,在一个屏幕中 ...

  7. swiper的介绍以及使用(移动端滑动屏幕切换页面案例)

    一.swiper介绍 Swiper常用于移动端网站的内容触摸滑动  Swiper是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端.  Swiper能实现轮播图.触屏焦点图.触屏 ...

  8. java 滑块控制图片渐变切换_Android实现滑动屏幕切换图片

    本文实例为大家分享了Android实现滑动屏幕切换图片的具体代码,供大家参考,具体内容如下 activity_main.xml 文件代码: xmlns:app="http://schemas ...

  9. 小程序滑动屏幕切换视频

    项目需求:滑动屏幕,切换短视频,实现类似抖音等短视频平台的视频切换效果 最终效果图:滑动屏幕自动加载,切换视频和产品图片 分析:video是原生标签,层级太高,在全屏的情况下,其他组件均会被遮挡,所幸 ...

最新文章

  1. 【SSRS】入门篇(二) -- 建立数据源
  2. spring hibernate 连接sqlserver 数据库的时候还需要jdbc包吗?
  3. 爬虫框架Scrapy的第一个爬虫示例入门教程
  4. postgresql 排序索引
  5. 汉明距离—leetcode461
  6. UITabBarController 和 UINavigationController 的详解
  7. 台式计算机优点英语作文,跪求一篇英语作文 题目:论计算机的优缺点
  8. Windows Server 2008 R2 Tomcat 开机自启动
  9. mysql 把一列转多行_Oralce 按分隔符把一列转成多行
  10. Oracle11g导出空表解决方法
  11. Linux中tty框架与uart框架之间的调用关系剖析
  12. 智能图形开发板SmartGLCD
  13. 如何解决样本不均衡问题
  14. 上海交通大学计算机科学与技术招生网,上海交通大学计算机科学与技术研究生招生...
  15. 自学php多久可以工作_php自学要多久,学php难吗,多久能学会?
  16. 一个比较稳定的PLC通讯模块设计
  17. 【Vegas原创】HP惠普笔记本重装系统无法引导无法进操作系统的终极解决方法
  18. markdown使用及快捷键
  19. jmeter查看平均响应时间_Jmeter查看QPS和响应时间随着时间的变化曲线
  20. Retrofit2网络框架的使用

热门文章

  1. Mac下安装PIL库
  2. Kali Linux 64位安装WPS
  3. Jquery真的不难~第五回 JQ中的遍历(遍历中的性能知识点)
  4. SparkSQL Spark on Hive Hive on Spark
  5. 黄聪:Dsicuz x2.5、X3、X3.2如何去掉域名后面的/forum.php
  6. 一段js的***程序
  7. 做事先做人 --- 我的十三条军规
  8. 【poe设备加电配置】
  9. asp 去除最后一个逗号为空字符串的代码
  10. 使用DBCC SHRINKFILE EMPTYFILE 选项迁移数据