这一篇博客我们来使用 UGUI 实现图片的拖拽功能。

说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还有一种就是 UI 在Canvas内的坐标(暂时叫做ugui坐标。),这两个坐标是不一样的,所以拖拽是就需要转换。因为鼠标的移动是屏幕坐标,而 UI 的移动是ugui坐标。转换的方法:

RectTransformUtility.ScreenPointToLocalPointInRectangle ( … );这个方法可以把屏幕坐标转换成 ugui 坐标。至于屏幕坐标和 UGUI 坐标的区别、转换之类的我就不讲了,因为我也是一头雾水,怕我说了你们直接关浏览器了。

这里我们只需要知道 UI 的坐标和鼠标的坐标是不一样的,他们之间的相互移动需要转换就行了。

既然需要转换,就少不了使用方法。所以这里有一些官方的 UGUI监听事件:

(我就不献丑翻译了,英语还是有点渣。)

要给控件添加以上的监听事件,有三种方法:

1、编写一个类,实现上面的接口(用哪个,实现哪个),给空间添加此脚本。

2、添加EventTrigger这个组件

添加想要添加的监听

然后就像给Buttong添加监听一样添加方法就行。

3、程序动态添加。

这里我使用第一种方法,后面两种有机会的话就讲一下。

现在我们就正式开始实现功能。新建一个 2D项目。场景中添加一张图片(不一定要图片,其他控件也行),然后给图片添加脚本,名为MyDrag,编辑:

using UnityEngine;

using UnityEngine.EventSystems;

using System.Collections;

using System;

//给空间添加监听事件要实现的一些接口

public class MyDrag : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandler,

IEndDragHandler, IPointerEnterHandler, IPointerExitHandler {

public RectTransform canvas; //得到canvas的ugui坐标

private RectTransform imgRect; //得到图片的ugui坐标

Vector2 offset = new Vector3(); //用来得到鼠标和图片的差值

Vector3 imgReduceScale = new Vector3(0.8f, 0.8f, 1); //设置图片缩放

Vector3 imgNormalScale = new Vector3(1, 1, 1); //正常大小

// Use this for initialization

void Start () {

imgRect = GetComponent();

}

//当鼠标按下时调用 接口对应 IPointerDownHandler

public void OnPointerDown(PointerEventData eventData)

{

Vector2 mouseDown = eventData.position; //记录鼠标按下时的屏幕坐标

Vector2 mouseUguiPos = new Vector2(); //定义一个接收返回的ugui坐标

//RectTransformUtility.ScreenPointToLocalPointInRectangle():把屏幕坐标转化成ugui坐标

//canvas:坐标要转换到哪一个物体上,这里img父类是Canvas,我们就用Canvas

//eventData.enterEventCamera:这个事件是由哪个摄像机执行的

//out mouseUguiPos:返回转换后的ugui坐标

//isRect:方法返回一个bool值,判断鼠标按下的点是否在要转换的物体上

bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, mouseDown, eventData.enterEventCamera, out mouseUguiPos);

if (isRect) //如果在

{

//计算图片中心和鼠标点的差值

offset = imgRect.anchoredPosition - mouseUguiPos;

}

}

//当鼠标拖动时调用 对应接口 IDragHandler

public void OnDrag(PointerEventData eventData)

{

Vector2 mouseDrag = eventData.position; //当鼠标拖动时的屏幕坐标

Vector2 uguiPos = new Vector2(); //用来接收转换后的拖动坐标

//和上面类似

bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, mouseDrag, eventData.enterEventCamera, out uguiPos);

if (isRect)

{

//设置图片的ugui坐标与鼠标的ugui坐标保持不变

imgRect.anchoredPosition = offset + uguiPos;

}

}

//当鼠标抬起时调用 对应接口 IPointerUpHandler

public void OnPointerUp(PointerEventData eventData)

{

offset = Vector2.zero;

}

//当鼠标结束拖动时调用 对应接口 IEndDragHandler

public void OnEndDrag(PointerEventData eventData)

{

offset = Vector2.zero;

}

//当鼠标进入图片时调用 对应接口 IPointerEnterHandler

public void OnPointerEnter(PointerEventData eventData)

{

imgRect.localScale = imgReduceScale; //缩小图片

}

//当鼠标退出图片时调用 对应接口 IPointerExitHandler

public void OnPointerExit(PointerEventData eventData)

{

imgRect.localScale = imgNormalScale; //回复图片

}

}

unity图片拖不进去_Unity UGUI实现简单拖拽图片功能相关推荐

  1. 图片转可编辑ppt_电脑如何简单快速将图片转为文字,不用下载任何软件,免费使用。...

    分享一个简单快速的电脑图片转为文字方法,不用下载任何软件,全免费使用. 一.文本图片转文字 1.打开电脑,点开始,找到你的office,点开oneNote,注意别用win10的版本: 2.点开oneN ...

  2. JS实现图片懒加载的几种简单方式,图片懒加载

    记得以前手机端有个业务时将用户上传的的图片在用户往上滑动手机的时候呈现,由于刚开始用户数量少就没留意,直接将后台的数据拉过来渲染,当时后台也没有分页,可是后来参与用户多了起来,跳转到这个页面就渲染个几 ...

  3. 如何快速减小图片的体积?一招教你在线压缩图片大小

    怎样才能快速压缩图片大小而不失真呢?很简单,使用图片在线压缩(https://www.yasuola.com/)工具-压缩啦,就能轻松解决图片体积过大的问题,在压缩图片体积的同时不影响画质,具体操作方 ...

  4. unity 设置图片九宫格_Unity UGUI篇 Image图片

    今天介绍一下 UI 组件之 Image 组件 , Image 用来显示图片的 . 我们从unity 里选取一张图片 , 修改为 sprite格式 然后把图片拖到 Image 组件中的 Source I ...

  5. Unity 基础 之 在 UGUI 上简单实现VideoPlayer视频播放的功能,简单暂停播放/显示视频名称/显示时长/拖拽播放等

    Unity 基础 之 在 UGUI 上简单实现VideoPlayer视频播放的功能,简单暂停播放/显示视频名称/显示时长/拖拽播放等 目录 Unity 基础 之 在 UGUI 上简单实现VideoPl ...

  6. ps图片拖不进去_ps不能直接把图片拖进去怎么办

    每当用户需要对图片进行深入修改时,ps软件无疑是最好的选择,如今越来越多的用户都开始熟悉ps软件的操作,可是为了能够提高操作效率,我们在选择想要修改的图片时,却不能直接把图片拖进去,那么ps不能直接把 ...

  7. image unity 拉伸_Unity UGUI基础之Image

    UGUI的Image等价于NGUI的Sprite组件,用于显示图片. 一.Image组件: Source Image(图像源):纹理格式为Sprite(2D and UI)的图片资源(导入图片后选择T ...

  8. ui unity 图片高亮_Unity5 UI图片变灰处理(UGUI)(二)

    图片"变灰"处理是再寻常不过的要求了,特别按钮,头像等UI图片的"变灰"处理非常常见.比如: 网上已经有很多的实现方法,但是Unity5.3.8以后,对于使用s ...

  9. 【Unity】UGUI动态切换不同尺寸图片时自动设置Image大小

    UGUI动态切换不同尺寸图片时自动设置Image大小: 1. image.SetNativeSize(),将Image设置为贴图的原始尺寸 2. sprite.rect获取贴图尺寸,rectTrans ...

最新文章

  1. Only the original thread that created a view hierarchy can touch its views
  2. 个人计算机中的cache,cache在计算机中的作用是什么?
  3. Christopher Manning​:Uber 出售自动驾驶部门是一个标志性事件​ | AI日报
  4. Listview中使用线程实现无限加载更多项目的功能
  5. java按行写入txt文件内容_JAVA编程:读文件,按行输出文件内容
  6. epoll与fork
  7. python自动化测试-D6-学习笔记之一(常用模块补充datetime模块)
  8. 泽泽计算机科技,《计算机与信息技术》大学技能学习丛书.pdf
  9. weakhashmap_Java WeakHashMap values()方法与示例
  10. 【windows】下Anaconda详细安装过程
  11. C语言和设计模式(备忘录模式)
  12. VS 2008的JavaScript代码提示功能 (学习老赵视频的笔记)
  13. 还有这种操作?浅析为什么要看源码
  14. FastDFS单机、单节点和多节点集群部署文档
  15. 基于单片机自行车自动防盗报警系统设计-基于单片机温度监测监控报警系统设计-基于单片机智能无线病床呼叫系统设计-基于单片机四路红外遥控开关电路设计【设计资料转发分享】
  16. matlab误差分析,数值分析之MATLAB实验一误差分析
  17. Java实现图像增强之伽马变换
  18. Python练习题答案: 分类新会员【难度:1级】--景越Python编程实例训练营,1000道上机题等你来挑战
  19. Symfony5 系列教程1-安装并认识symfony
  20. Android中Vitamio使用解析-电视台直播为例

热门文章

  1. CGCTF-Web-md5 collision
  2. WEB前端 深入了解JavaScript ajax—XHR对象
  3. (三)HTML 规范
  4. github unity 图片切换效果_CSS3图片模糊切换效果
  5. MySql 连接报 SSL 警告问题
  6. JS如何制作图形验证码
  7. nginx负载均衡常用的策略
  8. BD、人脸识别、KATA、Gray码--程序员杂志文摘
  9. word文档图标变成白纸_挽救你的文件 修复变成乱码的Word文档
  10. 使用Jmeter 创建Post请求