【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就可以,处于美观考虑,有空的时候可能实现一下缓动什么的?

0 0
原创粉丝点击