【ugui的坑】实现可拖拽的Sprite

2 篇文章 0 订阅
1 篇文章 0 订阅

最近由于个人项目的需要,必须去做一个可以被拖拽的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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值