【ugui的坑】实现可拖拽的Sprite
来源:互联网 发布:彩票代购源码 编辑:程序博客网 时间:2024/05/16 18:04
最近由于个人项目的需要,必须去做一个可以被拖拽的Sprite出来。这里涉及到的两个问题。
1.Sprite应该可以响应点击事件,拖拽事件等。
2.如何从屏幕坐标系转换为世界坐标系。
关于问题1,解决方案很多,但我发现ugui是有一些已经封装好了的方法的,非常方便可以直接拿来使用。
方案一,可以使用给想要响应的物体绑上一个EventTrigger脚本来实现,然后在面板中选择想要触发的事件以及想要绑定的处理方法。这种方案适合你想要触发的处理方法不在本物体身上的时候,因为它允许直接指定其他物体上绑定的处理方法。但是我没在这种方法中找到与该事件相关的数据(比如,OnPointerDown时的鼠标位置)。
方案二,自己在想要响应的物体上绑上脚本,然后去实现接口(比如IDragHandler等)。这种方法的好处是你可以获得一个类型为PotinerEventData的数据对象,里面有一些与触发的时间有关的数据,不用自己手动去获取,比较方便。
如果看到这篇文章的你,有更好的方法,欢迎与我交流~
关于问题2,试了一下最传统的ScreenToWorldPoint的方法,他要求传入一个屏幕坐标系,但是我很难准确的定位我鼠标选中的Sprite的Z轴值应该为多少,试了官网上说的nearClipPlane,效果不是很好,然后还有人说应该用Ray去做,我觉得……太麻烦了,就在找一些简单的方法,然后就发现了ScreenPointToLocalPointInRectangle((RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint)这个方法。目前我的理解是,rect指的是你的屏幕坐标是相对于哪个RectTransform而言,然后screenPoint指的当然就是屏幕坐标,也就是你鼠标的位置,cam就是相对应渲染的那个摄像机(screenPoint和cam都可以通过PotinerEventData来获取到),而localPoint指的就是一个本地的二维向量,这里需要特殊处理的是,如果你指向rect的中心,他返回的值是0,0(目前的项目中是这样,多的还没来得及测试),也就是说,你要以localPoint为基础再加上rect的postion,最终得出的位置才是实际位置。
然后就是一些实际编码了,目前只要转换完成后直接把localPoint加上rect的位置然后直接赋值给对应的View就可以,处于美观考虑,有空的时候可能实现一下缓动什么的?
- 【ugui的坑】实现可拖拽的Sprite
- unity UGUI实现类似NGUI切换Sprite的方式
- UGUI中动态改变image的sprite
- css sprite的实现
- UGUI实现的变速摇杆
- UGUI 实现滑入滑出的效果
- UGUI 实现物体的双击
- ugui简单的超链接实现
- UGUI 虚拟摇杆的实现
- Cocos2d 自定义Sprite的实现方法
- cocos2dx之如何实现自己的sprite
- 使用NGUI实现sprite的若隐若现,渐变
- ugui Sprite更换图片
- UGUI研究之Sprite
- ugui sprite替换方法
- UGUI 动态切换Sprite
- 【UGUI】UGUI的事件监听
- UGUI实现NGUI的UIEventListener功能
- 【POJ 1905】 Expanding Rods (二分)
- vc中调用Com组件的方法详解
- 快速排序算法
- 黑马程序员——Java工具类概述
- 欢迎使用CSDN-markdown编辑器
- 【ugui的坑】实现可拖拽的Sprite
- MySQL事务处理介绍
- php中的转义字符
- MySQL备份数据库
- MongoDB的索引(三)
- android SIM state
- 漫反射光照模型
- sqllite3打开在其他文件夹里的database
- 《深度学习的艺术 - 采桐》读书笔记