放大缩小功能是游戏开发中用到的功能,今天就来讲一下Unity中放大缩小怎么实现。

1.IDragHandler, IBeginDragHandler, IEndDragHandler这三个接口是Unity常用的接口,分别对应于拖拽,开始拖拽,可结束拖拽(需要注意的是,这三个接口只能运用在UGUI(无需添加Collider),Sprite不能使用(Sprite可以使用OnMouseDown,OnMouseDrag,OnMouseUp)),并且拖拽物体需要是Cavas下面的子元素。

先看一下简单的拖拽开始和拖拽结束,拖拽开始只有简单的判断是不是单点点击,记录点击的位置,标记拖拽状态为true。结束拖拽里面标记拖拽状态为flase。

    public void OnBeginDrag(PointerEventData eventData)
{
if (Input.touchCount <= )
{
isDrag = true;
lastPoint = Input.mousePosition;
}
} public void OnEndDrag(PointerEventData eventData)
{
isDrag = false;
}

重点看一下拖拽中这个方法:这个方法是在你按下的过程中一直在执行,基本上每一行都有注释,应该都很好懂的

    public void OnDrag(PointerEventData eventData)
{ if (isDrag && Input.touchCount <= )
{
//记录当前鼠标位置
currentPoint = Input.mousePosition;
//记录移动的距离 -号是因为我们要移动的是因为相机来显示物体的移动
//如果自己移动物体可以不加上-,原理是一样的,直接移动物体会造成重构,特别的有大量物体(比如地图的时候就会出现这种情况),性能上会消耗巨大
moveDir = -(currentPoint - lastPoint);
//规整z轴方向
moveDir = new Vector3(moveDir.x, moveDir.y, ); //如果移动的距离为0那么说明没有进行拖拽,直接返回
if (moveDir == Vector3.zero)
{
return;
} //这一段可以参考 https://www.jianshu.com/p/148725feecfa
//主要用于做到屏幕移动距离和相机移动距离保持一致,不随着缩放而改变
float aspect = eyeCamera.aspect;
float halfFOVTan = Mathf.Tan((eyeCamera.fieldOfView * 0.5f) * Mathf.Deg2Rad);
float hight = Mathf.Abs(eyeCamera.transform.position.z) * halfFOVTan * ;// 参照图片(计算透视相机视口宽高示意图)
float width = hight * aspect;
//计算实际上相机需要移动的距离
moveDir.x = moveDir.x / Screen.width * width;
moveDir.y = moveDir.y / Screen.height * hight; //相机移动距离:moveDir后面乘上的是一个下面我们要说的一个缩放系数,如果不加上的话会导致缩小之后移动比较慢一点,放大之后移动比较快速
eyeCamera.transform.Translate(moveDir * scale/6.6f); if (lastPoint != currentPoint)
{
lastPoint = currentPoint;
}
}
}

2.放大缩小

 
    //这里是因为我用的正交相机,而正交相机的默认size等于6.6    
   private float scale = 6.6f;
public void ScaleView()
{
//多点触摸, 放大缩小(记录两个新的触摸点)
Touch newTouch1 = Input.GetTouch(0);
Touch newTouch2 = Input.GetTouch(1);
     //判断是不是取消了,或者是新的点点击了或者抬起了直接退出ScaleView方法
for (int i = 0; i < Input.touchCount; ++i)
{
if (Input.GetTouch(i).phase == TouchPhase.Began || Input.GetTouch(i).phase == TouchPhase.Canceled ||
Input.GetTouch(i).phase == TouchPhase.Ended)
{
//取消之后当前点变成了上一个记录点
lastTouch2 = newTouch2;
lastTouch1 = newTouch1;
return;
}
} //计算老的两点距离和新的两点间距离,变大要放大模型,变小要缩放模型
float lastDistance = Vector2.Distance(lastTouch1.position, lastTouch2.position);
float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position); //两个距离之差,为正表示放大手势, 为负表示缩小手势
float offset = lastDistance - newDistance;
//放大因子, 一个像素按 0.01倍来算(100可调整)
float scaleFactor = offset / zoomFactor;
//当前的相机size
float localScale = eyeCamera.orthographicSize;
//计算整体的放大倍数
scale = localScale + scaleFactor;
if (scale < minScale)
{
scale = minScale;
}
else if (scale > maxScale)
{
scale = maxScale;
}
//调整相机的尺寸
Scale2D.SetCameraOrthographicSize(scale, eyeCamera);
//记住最新的触摸点,下次使用
lastTouch1 = newTouch1;
lastTouch2 = newTouch2;
}

Unity实现放大缩小以及相机位置平移实现拖拽效果的更多相关文章

  1. [Unity]背包效果-使用NGUI实现物品的拖拽效果Drag

    背包效果-使用NGUI实现物品的拖拽效果Drag 效果实现如图 对象层级关系图 PacketCell - Right 对象作为单元格背景 PacketContainer 对象作为单元格容器 Packe ...

  2. Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能

    首先推荐一下鸿洋大大的打造个性的图片预览与多点触控视频教程,这套教程教我们一步一步实现了多点触控实现对图片的平移和缩放的功能.这篇文章我将在鸿洋大大的基础之上做了一些扩展功能: 1.图片的惯性滑动 2 ...

  3. Canvas实现图片放大缩小移动操作

    对于HTML5相信大家都不陌生,很早就出来了,但是貌似都没有真正的使用过.最近做项目时要实现这样一个需求:一个图片,大小不固定,要求能实现类似地图一样放大.缩小.移动功能.这里就很合适使用html5的 ...

  4. Android 手势滑动,多点触摸放大缩小图片

    效果展示: 基本思路: <1>首先写一个图片控制类ImageControl,实现对图片控制的的基本操作,我们的图片控制类ImageControl是继承自ImageView自定义的视图: & ...

  5. Android DIY之路 (一) 指定区域多图片合成 放大 缩小 镜像 旋转 等(转)

    惯例先看效果图 // 注意做类似这种模板功能时候 方位由后台数据提供,这里我们用假数据 4个点 或者xy 加区域来做示例 //一开始我们公司用的是透明盖住 操作图片 但发现 局限性较大.后来直接限定区 ...

  6. canvas上画出坐标集合,并标记新坐标,背景支持放大缩小拖动功能

    写在前面:项目需求,用户上传一个区位的平面图片,用户可以在图片上添加新的相机位置,并且展示之前已绑定的相机坐标位置,图片支持放大缩小&拖动的功能.新增坐标,页面展示相对canvas定位,保存时 ...

  7. wpf下的图片放大缩小

    WPF下实现图片的放大缩小移动   在windows 7里面有自带的图片查看器,这个软件可以打开一张图片然后以鼠标在图片中的焦点为原点来进行缩放,并且放大后可以随意拖动.下面我们在WPF中实现这个功能 ...

  8. PhotoView实现图片随手势的放大缩小的效果

    项目需求:在listView的条目中如果有图片,点击条目,实现图片的放大,并且图片可以根据手势来控制图片放大缩小的比例.类似于微信朋友圈中查看好友发布的照片所实现的效果. 思路是这样的:当点击条目的时 ...

  9. 【开源】专业K线绘制[K线主副图、趋势图、成交量、滚动、放大缩小、MACD、KDJ等)

    这是一个iOS项目雅黑深邃的K线的绘制. 实现功能包括K线主副图.趋势图.成交量.滚动.放大缩小.MACD.KDJ,长按显示辅助线等功能 预览图 最后的最后,这是项目的开源地址:https://git ...

随机推荐

  1. 微信小程序社区爬取

    # CrawlSpider 需要使用:规则提取器 和 解析器 # 1. allow设置规则的方法:要能够限制在目标url上面, 不要跟其他的url产生相同的正则即可 # 2. 什么情况下使用follo ...

  2. Redis图形化客户端管理软件推荐

    Redis是一个超精简的基于内存的键值对NOSQL数据库(key-value),一般对并发有一定要求的应用都用其储存session,乃至整个数据库.不过它公自带一个最小化的命令行式的数据库管理工具re ...

  3. shell_链接命令ln与nohup命令使用方法

    ln命令是一个链接命令,工作中用的比较多的就是对一个文件或者是目录建立起软连接.软连接的概念类似于windows下的快捷方式.比如,在win下,我们经常在安装完word.ppt等office程序后,在 ...

  4. 哈夫曼编码与解码的C++实现:建立哈夫曼树、进行哈夫曼编码与解码

    最近完成了数据结构课程设计,被分到的题目是<哈夫曼编码和解码>,现在在这篇博文里分享一下自己的成果. 我在设计时,在网上参考了很多老师和前辈的算法和代码,向他们表示感谢!他们的成果给了我很 ...

  5. wpf怎么绑定多个值,多个控件

    最近有不少wpf新手问wpf的命令怎么绑定多个控件,很多人为此绞尽脑汁,网上的答案找了也没找到靠谱的,其实用MultiBinding就可以了.从.net 3.0版本开始,就支持MultiBinding ...

  6. cozmo 入坑日记及开发环境搭建

    前几日,朋友在群里发了一个机器人的小视频,视频里机器人可以对话,可以推箱子,开心以后会哈哈大笑,非常有趣. 详细了解里一下,这是个叫 cozmo 的智能机器人,可以配合 SDK 用 python 编程 ...

  7. Excel催化剂开源第49波-Excel与PowerBIDeskTop互通互联之第三篇

    在PowerBIDeskTop开启的SSAS服务,和Sqlserver所开启的一个本质的区别是,前者其端口号是随机生成的,即上一次打开获得的端口号,下一次关闭后再打开,系统分配给它新的端口号,而后者因 ...

  8. Android自定义的属性的使用

    获取引用类型的属性值 private void init(Context context, AttributeSet attrs) { //int textId = attrs.getAttribut ...

  9. MySql 命令(命令行)

    1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码1.连接到本机上的MYSQL. 首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...

  10. MyEclipse 2016 Stable 1.0破解教程

    一.下载所需文件 1. Windows最新版: MyEclipse 2016 Stable 1.0离线安装包(文件大小:1.52GB)--完整安装包,无需在线下载http://pan.baidu.co ...